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