polyanin
@polyanin
Golang, PHP & Symfony developer

Как оптимально получить все даты за месяц, за которые есть запись?

СУБД mysql
есть таблица новостей
там есть поле "дата" тип DATETIME и индекс по нему
требуется получить те даты в месяце, где есть новости, без повторов дат
только сами даты, время не надо. это для календарика.
стоит ль заводить ради этого поле с типом DATE с индексом по нему?
новостей около 1млн. записей
EXPLAIN SELECT DISTINCT DATE(`date`) 
FROM `news` 
WHERE `date` BETWEEN '2014.01.01' AND DATE_ADD('2014.01.01', INTERVAL 1 MONTH);

пишет Using where; Using index; Using temporary
с просмотром всех строк за месяц.
  • Вопрос задан
  • 2277 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Лучший способ, на мой взгляд - протестировать вашу гипотезу о том, что поле DATE и индекс по нему значительно ускорят запрос (я в этом уверен). Если это действительно так и количество изменений таблицы не превышает количество чтений в несколько десятков раз, то стоит поле ввести.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
а если вот так
SELECT DISTINCT DATE(`date`) as result_date FROM
(
SELECT `date` as tmp_datetime
FROM `news` 
WHERE `date` BETWEEN '2014-01-01' AND  '2014-02-01'
) tmp

UPD
Я думаю что заводить отдельное поле date - однозначно не стоит.
Если Вам нужно часто показывать этот календарик - я бы сделал отдельную табличку в которой закешировал даты в которых есть новости (и соответственно её обновлял при публикации/удалении новостей)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы