Индекс SQL замедляется из-за вызова функции - PullRequest
0 голосов
/ 27 июня 2018

Был SO вопрос Даты совпадения ошибок в PDO , на который я дал ответ и немного поговорил.

По сути, я сказал, что не используйте подстановочные знаки в датах:

SELECT * FROM table where datefiled LIKE '%2018-06%'

И вместо этого используйте что-то вроде (да, между ними тоже будет работать):

SELECT * FROM table where MONTH(datefield) = '06' and YEAR(datefield) = '2018

Это привело к комментарию к моему ответу, в котором говорилось, что ему сказали (данные с +90 миллионами строк):

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

Мое понимание алгоритмов поиска, которые реализует SQL, не так уж велико, но я понимаю, когда использовать, а не использовать индекс (чтение против записи). Вышеприведенное, по-видимому, подразумевает, что использование функций MONTH() и YEAR() будет менее эффективным, чем строка LIKE. Если бы комментарий был о BETWEEN, я бы получил его, но я не могу представить вариант использования, когда LIKE выиграет из-за вызова функции.

Если это возможно, что это за вариант использования?

1 Ответ

0 голосов
/ 27 июня 2018

LIKE требует преобразования даты в строку. Хотя преобразование неявное, оно все равно эквивалентно вызову функции и (как правило) предотвращает использование индекса.

Аналогично, MONTH() и YEAR() являются вызовами функций, и они запрещают использование индекса.

Вместо этого просто напишите неравенство:

SELECT t.*
FROM table t
WHERE datefield >= '2018-06-01' AND datefield < '2018-07-01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...