查询结果才一万多条就用了 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 就执行结果来看 你这速度一点不慢啊 这个慢是偶发的还是必现的? |