2011-01-16 2 views
2

У меня есть MySQL InnoDB таблицы, events, с 3-мя рядами:Запрос MySQL занимает больше времени с индексами?

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 

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

ответ

1

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 собирается собирать результаты (без индекса, с индексом, с индексом, но игнорируемым).

+0

Есть ли способ структурировать запрос, чтобы я мог хранить индексы (они будут помогать другим запросам), но все же выполнять перекрестное объединение и фильтр? – JaredC

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