【发布时间】:2014-02-04 18:03:03
【问题描述】:
我有一个大约 800 万行和 35 列的表(总体大小为 1G)。这用于涉及多级group by 条件的报告。这是一个这样的查询。
explain select min(a), max(a), avg(a), sum(b) from test where (c=2 or c=20 or c=18 or c=21 or c=12) and d>='2013-01-01' and d <= '2013-12-01' group by c,e;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 7
ref: NULL
rows: 154911
Extra: Using where; Using temporary; Using filesort
1 row in set (0.00 sec)
这需要大约 1.8 秒来执行。主键在c,d 上,用于评估 where 子句。具有相同 where 条件且没有 group by 的 count(*) 查询返回大约 150000 行。所以在实际查询中扫描的行也是可以的。但是,没有一个索引被用于对结果进行分组。我尝试将索引放在c 和c,e 上。
我的问题是,一旦应用了条件并且结果集在 tmp 表中,是否可以使用另一个索引进行排序/分组。
我已为tmp_table_size 分配了足够的内存。因此,tmp 表肯定不会磁盘。该表正在使用MyISAM。
【问题讨论】:
-
FWIW,我更喜欢 \G 来解释
-
您的查询引用了一个未定义的表别名
d(d.effective_date)。 -
@GordonLinoff : sry man.. 生效日期仍然是一个错误......我已经编辑了查询以使其更有意义。
-
这个查询返回多少行?
-
请注意您对日期的查询。如果您打算做一整年(截至 2013 年 12 月 31 日),并且您的交易记录在日期/时间字段中有 TIME 部分,那么这将不包括 2013 年 12 月 31 日 3:15 的所有 12 月 31 日数据早上大于 2013 年 12 月 31 日凌晨 12:00。您应该考虑少于 2014 年 1 月 1 日,因此它会一直持续到 12 月 31 日晚上 11:59:59。
标签: mysql sql database myisam database-optimization