V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
gonethen
V2EX  ›  问与答

关于 mysql 优化,请教大神们~

  •  
  •   gonethen · 2020-04-09 15:52:02 +08:00 · 1312 次点击
    这是一个创建于 1470 天前的主题,其中的信息可能已经有所发展或是发生改变。

    查询结果才一万多条就用了 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;
    
    
    16 条回复    2020-04-10 11:29:06 +08:00
    shoaly
        1
    shoaly  
       2020-04-09 16:03:22 +08:00
    用代码去做逻辑, 不要用 mysql 去编程....
    大部分情况 mysql 只需要查一个表, 极少数才会连 2 个表
    AngryPanda
        2
    AngryPanda  
       2020-04-09 16:07:45 +08:00
    @shoaly 那是你没做 ERP 之类的内部系统
    jjianwen68
        3
    jjianwen68  
       2020-04-09 16:09:10 +08:00
    先 explain 看看
    Vegetable
        4
    Vegetable  
       2020-04-09 16:09:47 +08:00
    问这种问题带个 DDL 朋友...
    show create table `tablename`;
    tomczhen
        5
    tomczhen  
       2020-04-09 16:10:12 +08:00 via Android
    自己看 explain,大神都快饿死了。
    ic2y
        6
    ic2y  
       2020-04-09 16:11:57 +08:00
    你表结构都没有,没有索引之类的 信息,大家怎么帮你看呢?
    chihiro2014
        7
    chihiro2014  
       2020-04-09 16:14:11 +08:00
    先 explain 分析下情况再看
    gonethen
        8
    gonethen  
    OP
       2020-04-09 16:15:18 +08:00
    @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
    dapang1221
        9
    dapang1221  
       2020-04-09 16:15:31 +08:00
    WHERE fence_status = '1' AND IFNULL(trucker_order_id, 1) != 1
    这啥玩意?直接 and trucker_order_id is not null 不行么……这玩意肯定全表扫了啊

    ON FIND_IN_SET(o.id, so.parents_id)
    还有这啥? join xx on x.id = xx.pid 然后 where 里加一个 xx.pid is not null 就行啊
    dilu
        10
    dilu  
       2020-04-09 16:15:58 +08:00
    SET profiling = 1;
    #执行语句
    show profiles;
    show profile block io,cpu for query 1;

    第二行换成你的 sql 跑一下贴结果来看看
    dapang1221
        11
    dapang1221  
       2020-04-09 16:16:07 +08:00
    有一说一我真就头一回见到 IFNULL 和 FIND_IN_SET 这俩东西,也许是我才疏学浅了吧……
    gonethen
        13
    gonethen  
    OP
       2020-04-10 09:48:50 +08:00
    @dapang1221 #9 parents_id 是以逗号隔开的多级父级 id,数据表结构是之前设计的锅,我不背
    dilu
        14
    dilu  
       2020-04-10 10:07:54 +08:00 via Android
    就执行结果来看 你这速度一点不慢啊 这个慢是偶发的还是必现的?
    gonethen
        15
    gonethen  
    OP
       2020-04-10 10:48:29 +08:00
    @dilu #14 必现的。10k 的数据需要 60s 肯定是不行的,所以我想要优化一下
    dilu
        16
    dilu  
       2020-04-10 11:29:06 +08:00
    @gonethen 微信沟通吧 emh3MTk5NDA0MTI=
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1256 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:29 · PVG 07:29 · LAX 16:29 · JFK 19:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.