美文网首页spring boot
sql 多表连接优化问题

sql 多表连接优化问题

作者: TDominator | 来源:发表于2019-10-31 17:51 被阅读0次

贴代码,一段特别简单的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)

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

相关文章

  • sql 多表连接优化问题

    贴代码,一段特别简单的sql 三张表关联zc_order:订单表 (6276条数据)zc_c_user:用户表 (...

  • 不可置信!SQL 优化终于干掉了“distinct”

    sql 优化之多表联合查询干掉 “distinct” 去重关键字 所以需要把多表的子查询的 sql 结构进行优化。...

  • SQL多表连接

    表结构 SQL语句

  • SQL多表查询高级应用

    SQL多表查询 多表连接示范 两张表t_user t_judge 给两张表设置外键约束查询内容 SQL多表查询 多...

  • mysql性能优化之慢查询日志分析

    一、慢查询 在我们的项目中, 有很多需要优化的sql语句, 比如多表连接查询, 通常很耗时, 那么怎么知道哪些sq...

  • sql

    sql语句 查询 简单查询 例: 多表连接查询 例: 2.更新

  • SQL多表连接查询

    Join关键字 join用于根据两个或者多个表之间的关系,查询所需结果数据,包括inner join,left j...

  • 复杂SQL的子查询性能问题

    复杂SQL的子查询中的多表关联,执行计划中表连接顺序不一样,导致sql执行效率降低。 案例1: 问题背景:测试环境...

  • Sql多表优化-1

    当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句. 这里需要注明的是,ORACL...

  • Sql多表优化-2

    重点关注6: 用TRUNCATE替代DELETE . 重点关注 当删除表中的记录时,在通常情况下, 回滚段(rol...

网友评论

    本文标题:sql 多表连接优化问题

    本文链接:https://www.haomeiwen.com/subject/ffitbctx.html