MySQL: выборка за определенный период с использованием индекса

Для того, чтобы получить данные из mysql db за определенный период (допустим за последнюю неделю) можно воспользоваться примером из официального мануала:

SELECT * FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 7

Но этот вариант совершенно неэффективный.

Уже на 100k записей время первого запроса может составлять 2-3 секунды, что для веба критично. Конечно, потом все падает в кеш и работает быстрее, но кеш-то «не резиновый» и другие данные могут запросто вытеснить старые вычисления.

И дело не в наличии/отсутствии индекса на date_col. В вышеприведенном запросе индекс не используется, TO_DAYS(date_col) вычисляется для каждой строки.

Правильное решение (индекс используется):

SELECT * FROM table WHERE date_col>=DATE_ADD(CURRENT_TIMESTAMP,INTERVAL -7 DAY)

Таким образом вы не только увеличите производительность вашего приложения, но и снизите выброс углекислого газа в атмосферу от бестолковой работы серверов.

Спасибо Google за выдержку из книги:
MySQL: Полное и исчерпывающее руководство по применению и администрированию баз данных MySQL4, а также программированию приложений (пер. Воронина Н.В.)

Документация по Mysql на русском языке

Оставить комментарий

Получать новые комментарии на email. Вы можете подписаться без комментирования.