求教大佬 sql 问题

2020-09-14 13:57:44 +08:00
 chaodada

sql 如下

SELECT sum(money) as money,order_id,ordertime,earning_time FROM `wx_lianmeng_relation` force index(uid)  WHERE uid=726080 and `ordertime`>=1590940800 GROUP BY `order_id`

当执行该语句时 Copying To Tmp Table 有时候会存在 5-6 秒左右的耗时

这是我的配置 求大佬执教... https://p.pstatp.com/origin/137650001eeb8c64440ad

https://p.pstatp.com/origin/1384400013664b8722789

2718 次点击
所在节点    MySQL
21 条回复
brader
2020-09-14 14:04:29 +08:00
你方便使用 `EXPLAIN` 看下你的执行计划,然后贴出来吗?
VeryZero
2020-09-14 14:49:08 +08:00
起码发下表结构啊
wakzz
2020-09-14 15:49:12 +08:00
表结构和表数据量
pushback
2020-09-14 16:30:23 +08:00
SELECT
model.*,
(SELECT SUM(money) FROM `wx_lianmeng_relation` WHERE order_id = model.order_id) as money
FROM
(
order_id,
ordertime,
earning_time
FROM
`wx_lianmeng_relation` FORCE INDEX ( uid )
WHERE
uid = 726080
AND `ordertime` >= 1590940800
GROUP BY
`order_id`
) as model

@chaodada 你试试这个,聚合函数和 group by 在处理同一结果集时会变慢,具体还需要看文档,总之先用 model 包一层缩小结果集吧
justgodlike1993
2020-09-14 16:42:20 +08:00
新建个(uid,ordertiem,orderid)的索引,避免排序
justgodlike1993
2020-09-14 16:52:28 +08:00
@justgodlike1993 看错了 (lll ¬ω¬)
kiracyan
2020-09-14 17:04:35 +08:00
歪个楼 只 group by 'order_id' 这个 SQL 可以跑吗
des
2020-09-14 17:07:11 +08:00
@kiracyan mysql 是这样的,新版本需要加 ANY_VALUE
chaodada
2020-09-14 17:31:58 +08:00
@wakzz 感谢大佬的回复 数量大概是 1400w 左右
chaodada
2020-09-14 17:33:54 +08:00
这个状况 很奇怪 就慢那一次 然后过个一个多小时 就 出现慢一次 然后一直这样子
MaxFang
2020-09-14 21:15:26 +08:00
@chaodada 可能是查询缓存。可以发下表结构,如果 uid 有索引的话,理论上不会太多啊,单用户的订单量会有多少呢。
chaodada
2020-09-15 09:42:20 +08:00
justgodlike1993
2020-09-15 10:12:06 +08:00
新建个(uid,order_id)的索引,然后看看执行计划还有排序不
brader
2020-09-15 10:40:41 +08:00
@justgodlike1993 我觉得建立(uid,order_id)是不起作用的,应该建立(uid,ordertiem)索引,从执行计划以及查询结果综合分析,应该能将扫描行数从 44000 行缩减到 22000 行左右。

当然,不管是 4 万行,还是 2 万行,mysql 的文件排序,我认为不应如此慢,综合楼主上面提到的,是偶然亦或规律性出现这样的问题,那么我觉得还应该考虑是否出现了锁等待,比如:是否有某个定时任务。
gakkiismywife1
2020-09-15 11:36:25 +08:00
看下是否是在内存中排序还是外部排序,外部排序相对会比较慢
gakkiismywife1
2020-09-15 11:37:16 +08:00
@gakkiismywife1 看错了不是排序 哈哈哈
chaodada
2020-09-15 12:24:08 +08:00
@brader 确实我门这个数据表 读写特别频繁。。。
wakzz
2020-09-15 17:33:15 +08:00
用 uid 索引,不慢才怪呢,会对 uid=726080 的所有记录回表。建议对 uid,ordertime,order_id 做联合索引,减少回表次数。
wakzz
2020-09-15 17:37:08 +08:00
以及执行一下命令`show global status like '%tmp%';`,看看临时表有多少次是创建了磁盘临时表。磁盘临时表会非常影响性能。
chaodada
2020-09-15 18:17:45 +08:00
@wakzz #19 感谢大佬的回复,我尝试一下😚😚

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/706852

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX