2015-03-25 3 views
2

Предположим, у меня есть небольшая база данных с тремя столбцами: «id1», «id2» и «date». Я индексирую свою базу данных в поле «id1», так как это часто выбираемое поле (многие запросы выбора запускаются с ex: где «id1» = 125548).Индексирование по полю и «упорядочивание» по другому полю

В каком-то конкретном запросе у меня есть необходимость сортировать записи пользователя на основе поля даты в таблице, которая не индексируется. Мое любопытство заключается в том, что операция сортировки (которая в основном работает по порядку) на поле даты будет побежал по всей базе данных, или только на строках пользователя (например:. 125548), который я выбираю на основе поля «iD1»

Ниже приведен пример запроса:

SELECT u 
FROM UserView u 
WHERE u.viewedId=:viewedId AND u.viewDate >=:dateLimit 
ORDER BY u.viewDate DESC 
+0

Был бы глупым оптимизатором, если он закажет сначала, прежде чем он начнет фильтровать записи. Весь заказ был пустой тратой времени. –

+0

Я тоже так думаю, но где-то я читал, что это то, что происходит. – ralzaul

+0

Показать ваш запрос. –

ответ

0

FIrst, вы можете создать индекс, который будет делать то же самое, если ваш запрос действительно прост:

select . . 
from table t 
where id1 = X 
order by col2 

Сводный индекс на table(id1, col2) может использоваться как для where, так и для order by.

Что касается вашего вопроса. В общем, фильтрация будет выполнена в первую очередь. Там могут быть некоторые базы данных, которые будут смотреть на статистику для таблицы и сказать «gosh, половина записей имеет id1, и у меня есть индекс на col2 - я буду использовать индекс для сортировки». Однако ни одна база данных не сортировала бы все данные (в отличие от использования индекса), а затем фильтровать их потом. Сорта более эффективны при меньших объемах данных.

EDIT:

Для вашего запроса:

SELECT u 
FROM UserView u 
WHERE u.viewedId=:viewedId AND u.viewDate >=:dateLimit 
ORDER BY u.viewDate DESC; 

Оптимальный показатель UserView(ViewId, viewDate). Предполагая, что UserView представляет собой таблицу (или, возможно, представление, которое выбирается только из одной таблицы), этот индекс должен использоваться как для WHERE (оба предложения), так и для ORDER BY.

+0

спасибо за ответ, создание и индексирование по дате возможно, но я думал, что это может стоить слишком много места и производительности, поскольку я часто вставляю их. – ralzaul

+0

@ralzaul. , , Индекс с двумя столбцами не займет гораздо больше времени для вставок, чем индекс с одним столбцом. Это займет больше места, но для этого вам придется быть в условиях ограниченного пространства. –

+0

Я вижу вашу точку зрения, поэтому, когда мы индексируем их вместе как UserView (ViewId, viewDate), все равно все-таки одно дерево b? – ralzaul

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