Следующий запрос приводит к сканированию таблицы в таблице e
(StationEvents
) на ~ 250 тыс. Строк.
SELECT COUNT(e.Id)
FROM `StationEvents` AS `e`
LEFT JOIN `Keys` AS `t` ON `e`.`KeyId` = `t`.`Id`
LEFT JOIN Stations AS `t2` ON `e`.`StationId` = `t2`.`Id`
WHERE (t2.Name like 'g%') or (t.name like 'g%')
Однако, когда я удаляю левую или правую часть предложения OR
, запрос выполняется намного лучше. Например, если я удаляю правую сторону, он использует индекс на Stations
и сканирует только ~ 600 записей. Почему при добавлении предложения OR происходит полное сканирование таблицы?
Имея всего одно предложение, кажется, что он сначала сканирует индекс станций и выполняет "обратное" объединение, чтобы вернуться к запрошенному результату, что имеет смысл.
Я ожидаю, что с предложением OR он должен отсканировать индекс Stations.Name
, отсканировать индекс Keys.Name
и, в основном, присоединиться к таблице StationEvents для выбранных KeyId
и StationIds
, так как это только соответствующие результаты. Все таблицы в этом объединении имеют настроенные внешние ключи.
Я что-то здесь неправильно понимаю? Что происходит, что требует полного сканирования таблицы?
В поисках объяснения и возможных путей повышения производительности этого запроса. Я использую MariaDB 10.3.