Recosh
@Recosh
Программист студент

Виртуальная колонка в MySQL или как правильно работать с датами в MySQL?

Здравствуйте. Существует таблица, в которой есть колонка datetime, где содержится дата и время. Поле проиндексировано.

И допустим хочу достать данные за определённые числа, и сконструировал запрос с таким условием
WHERE DATE_FORMAT(date, "%Y-%m-%d") IN ("2018-06-19","2018-06-20","2018-06-26")


И всё повисло... База на продакшене, добавлять новое поле с типом DATE довольно долго, данных очень много. Подскажите как правильно построить запрос.

Вариант с диапазонами (2018-06-19 00:00:00 - 2018-06-19 23:59:59) для каждого дня пока не пробовал, считаю это костылём, который по предчувствию так же будет тормозить.
  • Вопрос задан
  • 580 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Формат условия "функция(поле_таблицы) оператор" в принципе не может использовать индекс по этому полю. Если нет других селективных индексов - гарантированный fullscan.
Формат условия "поле_таблицы between ? and ?" - может использовать индекс.

Выводы?
3 диапазона через or или, возможно, эффективнее будет 3 union all в каждом по одному диапазону. Не помню насколько адекватно нынче mysql ведёт себя с or.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
between начало дня and конец дня и union all на каждую дату.

Вариант с диапазонами (2018-06-19 00:00:00 - 2018-06-19 23:59:59) для каждого дня пока не пробовал, считаю это костылём, который по предчувствию так же будет тормозить.

нет, не будет.
Ответ написан
Комментировать
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Как минимум можно убрать DATE_FORMAT(хотя может это только для date подойдёт, а не datetime), в остальном никаких оптимизаций не вижу возможных для выборки случайных дат пачкой.

Индексируйте как-нибудь еще, либо ограничивайте выборки на уровне интерфейса(только периодами).
Может попробовать в элестик/sphinx засунуть.

База на продакшене, добавлять новое поле с типом DATE довольно долго, данных очень много

mysql 8+ умеет добавлять быстро новые столбцы.

Только толку добавлять date, если с datetime не можете разобраться, шило на мыло поменяется.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы