Для запроса:
WHERE NOW() >= date_from
AND NOW() <= date_to
Составной индекс (date_from, date_to)
бесполезен.
Создайте оба индекса: (date_from)
и (date_to)
и пусть оптимизатор SQL принимает решение каждый разкакой использовать.В зависимости от значений и селективности оптимизатор может выбрать тот или иной индекс.Или ни один из них.Нет простого способа создать индекс, который будет учитывать оба условия.
(Пространственный индекс можно использовать для оптимизации такого условия, если вы можете перевести даты в широту и долготу).
Обновление
Моя ошибка.Индекс на (date_from, date_to, object_id)
может и действительно используется в некоторых ситуациях для этого запроса.Если селективность NOW() <= date_from
достаточно высока, оптимизатор решит использовать этот индекс, чем выполнять полное сканирование таблицы или использовать другой индекс.Это связано с тем, что это закрывающий индекс, то есть для извлечения данных из таблицы не требуется, требуется только чтение из данных индекса.
Незначительное примечание (не связано с производительностью, только правильность запроса).Ваше состояние эквивалентно:
WHERE CURRENT_DATE() >= date_from
AND ( CURRENT_DATE() + INTERVAL 1 DAY <= date_to
OR ( CURRENT_DATE() = NOW()
AND CURRENT_DATE() = date_to
)
)
Вы уверены, что хотите этого или хотите это:
WHERE CURRENT_DATE() >= date_from
AND CURRENT_DATE() <= date_to
Функция NOW()
возвращает DATETIME
, тогда как CURRENT_DATE()
возвращает DATE
, без временной части.