【发布时间】:2011-04-19 21:09:25
【问题描述】:
我有以下疑问:
SELECT
`date`,
al.cost,
SUM(l.bnd) AS bnd,
l.type,
count(*) AS amount
FROM alogs AS al
INNER JOIN logs AS l ON al.logid = l.id
WHERE
aid = 0 AND
l.`date` >= '2010-01-17' AND
l.`date` <= '2011-04-19'
GROUP BY l.`date`, l.type
日志计数 500 万行
alogs 统计了 430 万行
执行时间约为 90 秒。
我有:
logs.id 上的主键(auto inc)
logs.date 上的索引 (BTREE)
alogs.logid 上的索引 (BTREE)
alogs.aid 上的索引 (BTREE)
我试过了:
- logs.type 上的索引(BTREE),但这并没有改善任何东西(我认为因为类型只能是两件事)
- logs.date 和 logs.type 的覆盖索引
- 每月在内部对日志表进行分区,但使用上面使用的时间跨度(覆盖所有分区)它甚至会变得更慢,因为有超过 2k 个不同的 id,所以无法根据帮助进行分区
- 从查询中剥离功能,直到可以快速查看问题所在。
我只需要删除 GROUP 子句(以及 SUM() 和 count(*) 函数即可获得正确的结果),这样执行时间就达到了亚秒级。
- 删除内存中的group子句和group,但是超过300万行的结果太多了,甚至需要更长的时间。
还有其他我可以做但我不知道的事情吗?如果是这样,我很想听听!
谢谢,
王者荣耀
编辑 (2011-04-22 11:30) 这是 EXPLAIN EXTENDED 结果
id| select_type| table| type | possible_keys| key | key_len| ref | rows | Extra
1 | SIMPLE | al | ref | logid,aid | adid | 4 | const | 3010624| Using temporary; Using filesort
1 | SIMPLE | l | eq_ref| PRIMARY,date | PRIMARY| 4 | al.logid| 1 | Using where
【问题讨论】:
-
选择了多少行?
-
哦,这真的取决于援助是什么,但在这种情况下,查询返回 168 行。 (如果没有 group 条款,这是 3-4mil)
-
您没有发布
EXPLAIN或EXPLAIN EXTENDED的结果。你试过了吗? -
编辑了帖子,你去吧。
标签: mysql query-optimization performance