我有一个统计表,该表的增长速度非常快(每天约有2500万行),我希望针对选择进行优化,该表可容纳内存,并且服务器具有大量备用内存(32G,表为4G)。
我的简单汇总查询是:
EXPLAIN select FROM_UNIXTIME(FLOOR(endtime/3600)*3600) as ts,sum(numevent1) as success , sum(numevent2) as failure from stats where endtime > UNIX_TIMESTAMP()-3600*96 group by ts order by ts; +----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+ | 1 | SIMPLE | stats | ALL | ts | NULL | NULL | NULL | 78238584 | Using where; Using temporary; Using filesort | +----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+
统计信息是一个innodb表,在结束时间上有一个正常的索引。
注意:我确实计划添加汇总表,但是目前这是我所坚持的,并且我想知道是否有可能在没有其他应用程序代码的情况下对其进行修复。
我一直在做本地测试。请尝试以下方法:
alter table stats add index (endtime, numevent1, numevent2);
并删除order by它,因为它应该是隐式的group by(我猜解析器order by在这种情况下只会忽略,但以防万一:)
order by
group by