DATE(`date`) AS `date2`Медленее CAST .
12345
Странно что индекс не пашет, поля то родственные. Ещё обратил внимание что у тебя тип в EXPLAIN - all , а у меня range.
Я разобрался !!!
SELECT id_building, COUNT(1) AS cnt, CAST(`date` AS DATE) AS date2index на date оставь. Нужно принудительно указывать его использовать
FROM `building_history`
FORCE INDEX ( date )
WHERE `action` = 1 AND date > DATE_ADD(NOW(), INTERVAL - 30 DAY)
GROUP BY date2, `id_building`