MySQL: Запрашивает ли значение, которого нет в индексе (даже если colunn IS проиндексирован), вызывает полное сканирование таблицы? - PullRequest
0 голосов
/ 22 марта 2020

У меня есть таблица с индексированным значением даты и времени. Скажем, он называется event_datetime.

Если я запрашиваю, используя известные существующие значения в таблице, запрос выполняется быстрее, чем если бы я использовал произвольную границу, например ::

SELECT SUM(event_datetime) FROM table WHERE DATE(event_datetime) >= '2020-03-01' AND DATE(event_datetime) <= '2020-03-21';

против:

SELECT SUM(event_datetime) FROM table WHERE DATE(event_datetime) >= '2020-03-01' AND DATE(event_datetime) <= '2020-03-31';

Предполагая, что в таблице существуют только строки данных со значением event_datetime до 2020-03-21 включительно, выполняет ли последний оператор запрос до 31-го числа для полного сканирования таблицы, поскольку значения больше, чем 2020-03 -21 'не найдены в idnex?

1 Ответ

1 голос
/ 23 марта 2020

С точки зрения производительности, проблема с вашим запросом заключается в том, что вы используете функции даты для предикатов:

DATE(event_datetime) >= '2020-03-01' AND DATE(event_datetime) <= '2020-03-21'

Использование DATE() в столбце фильтрация фактически препятствует использованию базой данных индекса на event_datetime, потому что функция должна быть применена ко всем значениям в столбце, прежде чем произойдет фильтрация. Мы говорим, что это делает запрос не SARGeable.

Намного лучше сделать:

event_datetime >= '2020-03-01' AND event_datetime < '2020-03-21'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...