gpt4 book ai didi

mysql slow select query,尝试了我知道的每一个优化技巧!

转载 作者:行者123 更新时间:2023-11-30 23:38:09 25 4
gpt4 key购买 nike

我有以下查询:

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),但这并没有改善任何东西(我认为因为类型只能是 2 个东西)
- logs.date 和 logs.type 的覆盖索引
- 在内部每个月对日志表进行分区,但是使用上面使用的时间跨度(涵盖所有分区)它甚至会变得更慢,不能根据援助进行分区,因为有超过 2k 个不同的 ID
- 从查询中剥离函数,直到可以快速查看问题所在。
我只需要删除 GROUP 子句(以及 SUM() 和 count(*) 函数以获得正确的结果),这样执行时间就缩短了亚秒级。
- 删除内存中的组子句和组,但超过 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

最佳答案

如果您的日期范围是日志表中的一小部分行,您希望它使用该索引。你说你在 logs.date 上创建了一个索引,但是你需要一个关于 (logs.date, logs.id) 的复合索引,这样 mysql 就不必从磁盘读取行来获取 id 来加入 alogs 表.您需要一个关于 alogs(log_id) 的索引用于连接。

您可能还可以通过将 SELECT 中的列也放入索引中来挤出更多内容,所以

 logs(date, id, bnd, type)
alogs(log_id, aid, cost)

关于mysql slow select query,尝试了我知道的每一个优化技巧!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5722746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com