查询结果才一万多条就用了 60s,请问大神们这句 sql 还有什么可优化的空间?
SELECT
count(tto.id)
FROM tb_order o
LEFT JOIN (SELECT
id,
trucker_order_id,
parents_id,
carrier_org_name,
fence_status
FROM tb_order
WHERE fence_status = '1'
AND IFNULL(trucker_order_id, 1) != 1
) so ON FIND_IN_SET(o.id, so.parents_id)
LEFT JOIN tb_transport tt ON tt.order_id = so.id
LEFT JOIN tb_trucker_order tto ON tto.id = so.trucker_order_id
WHERE o.org_id = '153645643245457'
AND IFNULL(so.id, 1) != 1;
1
shoaly 2020-04-09 16:03:22 +08:00
用代码去做逻辑, 不要用 mysql 去编程....
大部分情况 mysql 只需要查一个表, 极少数才会连 2 个表 |
2
AngryPanda 2020-04-09 16:07:45 +08:00
@shoaly 那是你没做 ERP 之类的内部系统
|
3
jjianwen68 2020-04-09 16:09:10 +08:00
先 explain 看看
|
4
Vegetable 2020-04-09 16:09:47 +08:00
问这种问题带个 DDL 朋友...
show create table `tablename`; |
5
tomczhen 2020-04-09 16:10:12 +08:00 via Android
自己看 explain,大神都快饿死了。
|
6
ic2y 2020-04-09 16:11:57 +08:00
你表结构都没有,没有索引之类的 信息,大家怎么帮你看呢?
|
7
chihiro2014 2020-04-09 16:14:11 +08:00
先 explain 分析下情况再看
|
8
gonethen OP @jjianwen68 #3
id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY o ref org_id org_id 195 const 20391 Using where; Using index 1 PRIMARY <derived2> ALL 40783 Using where; Using join buffer (Block Nested Loop) 1 PRIMARY tt ref oder_id oder_id 195 so.id 1 Using index 1 PRIMARY tto eq_ref PRIMARY PRIMARY 194 so.trucker_order_id 1 Using index 2 DERIVED tb_order ALL 40783 Using where |
9
dapang1221 2020-04-09 16:15:31 +08:00
|
10
dilu 2020-04-09 16:15:58 +08:00
SET profiling = 1;
#执行语句 show profiles; show profile block io,cpu for query 1; 第二行换成你的 sql 跑一下贴结果来看看 |
11
dapang1221 2020-04-09 16:16:07 +08:00
有一说一我真就头一回见到 IFNULL 和 FIND_IN_SET 这俩东西,也许是我才疏学浅了吧……
|
12
gonethen OP |
13
gonethen OP @dapang1221 #9 parents_id 是以逗号隔开的多级父级 id,数据表结构是之前设计的锅,我不背
|
14
dilu 2020-04-10 10:07:54 +08:00 via Android
就执行结果来看 你这速度一点不慢啊 这个慢是偶发的还是必现的?
|