Как оптимально получить все даты за месяц, за которые есть запись?
а если вот так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'
) tmpUPD
Я думаю что заводить отдельное поле date - однозначно не стоит.
Если Вам нужно часто показывать этот календарик - я бы сделал отдельную табличку в которой закешировал даты в которых есть новости (и соответственно её обновлял при публикации/удалении новостей)
Лучший способ, на мой взгляд - протестировать вашу гипотезу о том, что поле DATE и индекс по нему значительно ускорят запрос (я в этом уверен). Если это действительно так и количество изменений таблицы не превышает количество чтений в несколько десятков раз, то стоит поле ввести.