Индексы MySQL автоматически учитывают ORDER BY? - PullRequest
0 голосов
/ 06 февраля 2012

Если я создам индекс для (name, creation_at) и I

SELECT * WHERE name='blah' and created_at="blah" ORDER BY created_at DESC

Будет ли этот индекс заботиться о "order by"?

Если нет, как бы я создалindex, чтобы ORDER BY был более эффективным?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2012

Индексы BTREE (по умолчанию) могут использоваться для сортировки.Если индекс будет использоваться, зависит от того, что определит оптимизатор.

Вы можете использовать EXPLAIN перед вашим запросом, чтобы увидеть это.

Для этого запроса ORDER BY не окажет большого влияния.как вы ищете конкретный созданный_.

Если бы ваш запрос был больше похож на это:

SELECT * FROM foo WHERE name='blah' ORDER BY created_at DESC

или даже

SELECT * FROM foo WHERE name='blah' and created_at BETWEEN 'a' AND 'z' ORDER BY created_at DESC

Вы бы получили лучшие результаты, используя одинИндекс как по названию, так и по созданному (в таком порядке).Сначала он будет использовать индекс для сопоставления имени, а затем использовать тот же индекс для сортировки результатов.

ALTER TABLE foo ADD INDEX (`name`, `created_at`)

Конечно, это все еще необходимо проверить с помощью EXPLAIN.Оптимизатор базы данных будет делать то, что он считает наилучшим, в зависимости от точных значений запроса и объема данных, которые он оценивает.

0 голосов
/ 06 февраля 2012

Где возможно, индексы используются для заказа.Однако, в вашем примере, поскольку все результаты будут иметь значение "бла" для созданного_атека, заказывать нечего.Вы имели в виду следующее?

SELECT * WHERE name='blah' ORDER BY created_at DESC

В приведенном выше случае составной «охватывающий» индекс (name, creation_at) будет использоваться как для выбора WHERE, так и для сортировки.

Тип индекса по умолчанию - btree, и в верхней части дерева будут упорядочены все значения для name.Ниже каждой ветви имени будет упорядочен каждый created_at.

Таким образом, MySQL будет использовать верхнюю часть индекса, чтобы найти раздел индекса, где name равен «бла», и использовать остальную частьветви, расположенные ниже, чтобы вернуть первичные ключи для результатов created_at, в том же порядке, что и индекс.

Поскольку записи будут возвращены, уже по порядку, не будет необходимости их дальнейшей сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...