MySQL запрос занимает больше времени с индексами? - PullRequest
2 голосов
/ 17 января 2011

У меня есть таблица MySQL InnoDB, events, с 3 строками:

event_id  ---> int
start     ---> long
end       ---> long

Я написал простой запрос для получения всех событий в некотором диапазоне, конфликтующих с другим событием:

select a.* from events a, events b 
where a.event_id != b.event_id and 
      a.start < b.end and 
      b.start < a.end

Таблица содержит ~ 10 тыс. Строк, и ее выполнение заняло ~ 2 секунды.Пытаясь настроить таблицу для повышения производительности, я добавил индексы для столбцов start и end.По какой-то причине это резко замедлило производительность в 5x раз.Кто-нибудь знает или имеет какие-либо идеи, почему добавление этих индексов ухудшило бы производительность?

1 Ответ

1 голос
/ 17 января 2011

MySQL смотрит на соответствующие столбцы и вводит в заблуждение, полагая, что индексы помогут улучшить запрос. Но проблема в том, что индексы решают начальные и конечные части, но требуют разрешения обратно к идентификаторам записей для разрешения a.event_id! = B.event_id, что само по себе является дорогостоящей операцией.

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

Если ваш запрос ограничен некоторым диапазоном на a или b относительно начала и конца таблицы и / или таблица больше 10k, это может стать совсем другой картиной.

Если вам нужно сохранить индекс, вы можете заставить конкретный запрос (если вы знаете, что это помогает) игнорировать индекс:

select a.*
from events a ignore index (index1)
cross join events b ignore index (index1)
where a.event_id != b.event_id and 
      a.start < b.end and 
      b.start < a.end

Предполагается, что индекс назван index1. В любом случае всегда полезно посмотреть, что MySQL делает в каждом случае, добавив «EXPLAIN» перед запросом, чтобы показать, как MySQL собирается собирать результаты (без индекса, с индексом, с индексом, но игнорируется)

...