优化大表上的简单mysql选择(75M +行)

时间:2012-03-04 02:22:06

标签: mysql sql indexing innodb

我有一个统计表,它以很大的速度增长(大约25M行/天),我想优化选择,表适合内存,服务器有足够的备用内存(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 |
+----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+

Stats是一个innodb表,在endtime上有一个正常的索引..我应该如何优化它?

注意:我确实计划添加汇总表,但目前这是我坚持使用的,我想知道是否可以在没有其他应用程序代码的情况下修复它。

2 个答案:

答案 0 :(得分:1)

我一直在做本地测试。请尝试以下方法:

alter table stats add index (endtime, numevent1, numevent2);

并删除order by,因为它应隐含在group by中(我猜解析器在这种情况下只是忽略了order by,但以防万一:)

答案 1 :(得分:0)

由于您使用的是InnoDB,您还可以尝试以下方法:

a)将innodb_buffer_pool_size更改为24GB(需要服务器重启) - 这将确保您的整个表可以加载到内存中,因此即使表变大,也会加快排序

b)添加innodb_file_per_table,使InnoDB将每个新表空间放在自己的表中。需要您删除现有表并重新创建它

c)使用适合数据的最小可用列大小。没有看到实际的列定义和一些样本,我无法提供任何具体的想法。你能提供一个样本架构,也许还有5行数据