Как оптимизировать MySQL запросы, содержащие DATE_ADD ()? - PullRequest
0 голосов
/ 18 октября 2011

Вот запрос, который необходимо оптимизировать:

Scans: 527676 records...
Returns: 496 records...

SELECT * FROM customers c
WHERE DATE_ADD(c.`custdate` ,INTERVAL -5 HOUR) BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59'
AND c.`custtype`='L'

То же самое без использования DATE_ADD:

Scans: 801 records...
Returns: 481 records...

SELECT * FROM customers c
WHERE c.`custdate` BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59'

Вопрос: как мне оптимизировать этот запрос с помощью функции DATE_ADD ()? Без использования DATE_ADD он берет мои индексы и запрос в порядке.

Ожидается помощь по этому вопросу.

Спасибо

Рахил

1 Ответ

3 голосов
/ 18 октября 2011

Поскольку вы просто добавляете постоянный интервал времени к c.custdate, вместо этого следует вычесть этот интервал времени из значений BETWEEN, чтобы получить логически эквивалентный запрос, но разрешающий MySQL использовать индекс.В общем, если запрос требует оценки функции значений индекса, сканирование диапазона не может быть использовано.

То есть: вместо условия WHERE, равного

DATE_ADD(c.`custdate` ,INTERVAL -5 HOUR) BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59'

сделать это

c.`custdate` BETWEEN '2011-09-14 05:00:00' AND '2011-09-15 04:59:59'
...