Задача выбрать топ 30 ip за определенный период (месяц) с максимальным значением bytes.
SELECT SUM(bytes) as bytes, ip
FROM table
WHERE stamp_inserted >= '2015-04-01 00:00:00'
GROUP BY ip
ORDER BY bytes DESC
LIMIT 30
В таблице 10 000 000+ записей (будет расти).
Тип таблицы myisam, пробовал добавлять индексы как отдельно для bytes, ip, stamp_inserted. Так и делал составной индекс из трех. Explain пишет:
type: range
key: stamp_inserted (составной из всех трех)
rows: 6988465
extra: Using where; Using index; Using temporary; Using filesort
Запрос выполняется 15+ секунд. Если убрать order то 10 секунд.
Это нормально или я где-то чего-то не понимаю?
Структура таблицы:
CREATE TABLE IF NOT EXISTS `all` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`ip` char(15) NOT NULL,
`bytes` bigint(20) unsigned NOT NULL,
`stamp_inserted` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `ip` (`ip_dst`),
KEY `bytes` (`bytes`),
KEY `stamp_inserted` (`stamp_inserted`),
KEY `bytes_2` (`bytes`,`ip`,`stamp_inserted`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11218827 ;