贴代码,一段特别简单的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 看下原因
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 看下
完美解决!(有时间深入研究下 left join;right join;join)
如果对你有帮助请给个赞吧👍。