当前位置: 首页 > article >正文

[MYSQL]关于join的慢sql优化

结论:
● 多表关联查询时,保证被关联的字段需要有索引**(最关键)**
● 尽量避免三个表的 join。
● 需要 join 的字段,数据类型必须绝对一致;
● 注意排序字段,可能会导致索引失效,进行全表扫描
● 只使用单一表进行orderby,不要使用两张表的字段排序

排查过程

sql复现

SELECT
*
FROM
  `api_console_acq_business_task` task
  LEFT JOIN api_console_acq_business business on task.business_id = business.business_id
  LEFT JOIN api_console_acq_task_bill bill on task.`local_task_id` = bill.`task_id`
order by
  id desc
limit
  10, 10

索引情况如下

task:有business_id索引,有local_task_id索引
business:无business_id索引
bill:有task_id索引

执行计划如下

执行时间:120s
主要都是用了全表查询,效率极低

异常原因

多表关联查询时,关联的字段无索引

在 SQL 语句中,task是主表,而 business是关联表。
● 你 JOIN 了 business表,但该表只有 80 条数据,查询它本身应该不慢。
● 但如果 B.business_id没有索引,数据库在 JOIN 时可能会进行 全表扫描(Full Table Scan),每次都要遍历整张表去匹配 business_id,导致查询变慢。
● 索引建立后,数据库可以直接通过索引快速查找 business_id,避免全表扫描,提高查询效率。

orderby影响

该sql去除排序后,执行速度恢复正常;由于业务需要,该表需要按照id倒叙

  1. 索引未被利用,导致全表扫描(ALL)
    ○ 如果 id 没有索引或者查询优化器选择不使用索引,MySQL 可能需要 扫描整个表,然后进行排序,速度自然会慢。
  2. 涉及 JOIN,多表数据排序开销大
    ○ LEFT JOIN 可能导致 大量数据被合并,即使 task 表有索引,最终的 结果集仍可能较大,MySQL 可能会创建临时表并进行 filesort。
  3. Using filesort 导致磁盘 IO 变高
    ○ ORDER BY 在某些情况下会触发 外部排序(filesort),特别是在 未使用合适索引 或 数据量较大 的情况下。

解决如下

多表关联查询时,保证被关联的字段需要有索引

给business表新增一个idx_businessId索引内容
修改后,执行计划如下

执行时间:70ms

join扩充

原来MySQL内部采用了一种叫做 nested loop join (嵌套循环连接) 的算法。Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复,基本上MySQL采用的是最容易理解的算法来实现join
由上述内容克制
● 每次循环都能快速匹配到 business 和 bill 的记录,所以索引要 覆盖 JOIN 条件

原文地址:https://blog.csdn.net/ChengHuanHuaning/article/details/146177555
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/586073.html

相关文章:

  • 《实战AI智能体》DeepSearcher 的架构设计
  • ChatGPT、DeepSeek、Grok:AI 语言模型的差异与应用场景分析
  • 学习15天:pytest
  • react(一):特点-基本使用-JSX语法
  • 用Deep seek解析ChatGPT打造数字虚拟人
  • Debezium日常分享系列之:Debezium 3.1.0.Beta1发布
  • 贪心算法五
  • 四种 No-SQL
  • 【MySQL】用MySQL二进制包构建docker镜像
  • 【MySQL - 表的内外连接】
  • [多线程]基于环形队列(RingQueue)的生产者-消费者模型的实现
  • Java设计模式之装饰者模式
  • 【综述】An Introduction to Vision-Language Modeling【一】
  • upload-labs通关攻略 【Pass-01~Pass-19】
  • NPM版本管理终极指南:掌握依赖控制与最佳实践
  • 【Yonghong 企业日常问题07 】 东方通TongWeb替代Tomcat的实战指南!
  • 压力测试Monkey命令参数和报告分析!
  • 如何处理PHP中的编码问题
  • iOS底层原理系列04-并发编程
  • 【软考-架构】5.1、七层模型-局域网-TCP/IP协议