Вопрос

У меня есть вопрос об этом запросе:

SELECT * 
  FROM runs 
 WHERE (NOW() BETWEEN began_at 
                  AND finished_at)

Как вы думаете, имеет смысл создать композитный индекс для Munch_at и Peating_at столбцы? Или это имеет смысл создавать индекс только для Munch_at?

Это было полезно?

Решение

Ваш стиль очень редко.

Большинство людей, вероятно, пишет WHERE began_at < NOW() AND finished_at > NOW()

Однако. Я бы порекомендовал положить индекс на обоих полях.

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

Ну, это не совсем верно, потому что если вы используете BeTreee, комбинированный ключ поможет вам, но не так хорошо, как если бы вы указали их отдельно. Объединенные ключи очень хороши, если вы ищете комбинации полей с оператором по вопросам равенства (=). Одиночные полевые индексы выпускают лучше в Ragen запросов.

Вы можете Google немного для «многомерного поиска».

Причина в том, что все соответствующие поля в одном поле могут быть в основном найдены в журнале (N) времени в BTRES. Таким образом, ваше общее время выполнения будет o (k * log (n)), который является O (log (n)).

Вопросы многомерного диапазона имеют время выполнения O (SQRT (N)), который выше. Однако есть лучшие реализации, а также а также логарифмическое время Acheav. Однако они не полностью реализованы в MySQL, поэтому он будет хуже или ужасно в зависимости от версии.

Итак, дайте мне подвести итоги:

  • Сравнение равенства на единых областях: хеш-индекс (время выполнения o (1))

  • Поиск диапазона на одном полях: индекс BTREE на одном полях (O log (n)))

  • Поиск равенства по нескольким полям: комбинированный хеш-ключ (время выполнения o (1))

Эти случаи ясна ...

  • Диапазон поиска на нескольких полях: отдельные индексы BTREE (O LOG (N)))

Это где его не так понятно. С текущими версиями его явно лучше индексировать отдельно из-за причин, приведенных выше. С идеальной реализацией для этого использования вы можете добиться лучшей производительности с комбинированными ключами, но в том, что нет системы, в которой он поддерживает ее. MySQL поддерживает свободные индексы (которые вам нужны для этого) с версии 5.0, но только очень ограничены, и оптимизатор запросов использует их только в редких случаях Afaik. Не знаю о более новых версиях, таких как 5.3 или что-то.

Однако с MySQL реализует свободные индексы комбинированные ключи на полях, где вы выполняете запросы на расстоянии или сортировку в разных направлениях, становятся все более актуальными.

Другие советы

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

Я бы выручил наклонность к двум индивидуальным индексам на обоих began_at а также finished_at.

Ссылки на свободное сканирование индекса:

http://www.mysqlperformanceblog.com/2006/05/09/descending-indexing-and-loose-index-scan/

http://dev.mysql.com/doc/refman/5.5/en/loose-index-scan.html.

Стратегия «Index Merge» может прийти в игру от MySQL 5 внутрь: http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html. - Что также предполагает, что отдельные индексы могут быть лучше.

Тем не менее, я никогда не смог заставить его работать для меня :)

Правильный ответ на этот вопрос всегда есть: «Это зависит». Попробуйте оба образом и ориентир и сравните планы исполнения. Обратите внимание, что ответ также изменяется в качестве объема данных в ваших изменениях таблиц, и изменения рабочей нагрузки запросов. Индексы на развивающейся системе почти никогда не выходят и забывают.

Хороший вопрос, но я на самом деле начну с индексов на обе began_at а также finished_at, потому что один разумный способ вы можете переписать этот запрос похож на это

SELECT *
  FROM runs
 WHERE began_at < NOW()
   AND finished_at > NOW()

Что делает его немного более понятным (для меня), что каждый столбец нужен свой собственный индекс.

Я никогда не получил MySQL использовать, используйте два отдельных индекса для begin_at или finished_at При попытке оптимизировать этот вид запроса. По-видимому, другие люди говорят, что композитный индекс тоже не будет работать, поэтому может быть невозможно получить MySQL для оптимизации этого запроса с помощью индекса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top