spring boot

sql 多表连接优化问题

2019-10-31  本文已影响0人  TDominator

贴代码,一段特别简单的sql

    SELECT
        o.*,
        u.mobile,
        coupon.create_time AS coupon_time 
    FROM
        zc_order o
        LEFT JOIN zc_c_user u ON o.user_id = u.id_
        LEFT JOIN zc_shop_coupon_verification_log coupon ON coupon.coupon_id = o.ID_

三张表关联
zc_order:订单表 (6276条数据)
zc_c_user:用户表 (9146条数据)
zc_shop_coupon_verification_log:订单核销记录表 (3818条数据)

可以看出数据量不大


查询速度

以上是不分页查询速度,可以看出很慢

我们通过 EXPLAIN 看下原因


image.png

rows代表这个步骤相对上一步结果的每一行需要扫描的行数,可以看到这个sql需要扫描的行数为6192*3707,比较大的一个数字了。几乎是两个表做笛卡尔积的开销了!!!

后来以为是没加索引导致,后来将所有表的关联字段,查询条件字段都添加了索引,结果还是一样;

查阅资料(问同事)后发现代码问题在这一块

LEFT JOIN zc_shop_coupon_verification_log coupon ON coupon.coupon_id = o.ID_

并不是所有订单都会有订单核销记录,并且一般情况下参与联合查询的两张表都会一大一小,如果是join,在没有其他过滤条件的情况下MySQL会选择小表作为驱动表,但是left join一般用作大表去join小表
所以将代码改为

JOIN zc_shop_coupon_verification_log coupon ON coupon.coupon_id = o.ID_

运行下sql查看下运行时间


运行时间

我们在通过 EXPLAIN 看下


image.png

完美解决!(有时间深入研究下 left join;right join;join)

如果对你有帮助请给个赞吧👍。

上一篇 下一篇

猜你喜欢

热点阅读