2016-12-23 7 views
-1

Если у меня есть таблица, которая содержит предыдущие покупки товаров из пользователя как так:фрагментация связанных записей в таблице

ID | ProductName | UserID 
1 | Grapes  | 3455 
2 | Water  | 1944 
3 | Bread  | 3455 
4 | Milk  | 3455 
... 

Как вы можете видеть в приведенном выше примере, пользователь 3455 купил виноград, хлеб и молоко. Если бы я хотел получить все продукты, купленные пользователем, мне пришлось бы найти каждую из записей, у которых есть пользователь 3455.

Будет ли хранить все продукты, которые принадлежат пользователю 3455, ускорить поиск этих записей, таких как дефрагментация жесткого диска? И если да, то процесс удаления старых записей и считывания их до конца базы данных будет пустой тратой вычислительной мощности?

+3

Нет, не очень хорошая идея. Просто добавьте индекс в 'UserID', и это почти похоже на хранение строк вместе. – RiggsFolly

+0

Лучше использовать нормализацию вместо небольшого аспекта производительности. Это сделает ваше программирование утомительным. –

ответ

1

Самый быстрый способ получить необходимую информацию - иметь индекс на t(UserId, ProductName). Это покрытия индекса для следующего запроса:

select ProductName 
from t 
where UserId = 3455; 

означает, что все столбцы, необходимого запрос в индексе, и в правильном порядке. Таким образом, оптимизатор запросов может разрешить запрос, используя только индекс. Это должно быть довольно быстро.

Смежные вопросы