Mysql一条多表关联SQL把CPU打爆了,如何优化

这篇具有很好参考价值的文章主要介绍了Mysql一条多表关联SQL把CPU打爆了,如何优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天是清明假期的第三天,收到同事的求助,DB的CPU被打爆了!

Mysql一条多表关联SQL把CPU打爆了,如何优化

查看监控,CPU已经被打爆100%

Mysql一条多表关联SQL把CPU打爆了,如何优化

登录mysql,DB无锁阻塞,元凶是一个异常sql,存在39个并发执行。

Mysql一条多表关联SQL把CPU打爆了,如何优化

SQL的明细如下:

select TEMPSALE.USER_ID_BUY,       TEMPSALE.ORDER_AMOUNT,       TEMPSALE.LAST_UPDATED_DATEfrom T_EAC_BU_SG_CO_INFO TSIrightjoin  (select TOI.SALE_PRO_ID,          TOI.USER_ID_BUY,          TOI.ORDER_AMOUNT,          TOI.LAST_UPDATED_DATE   from T_EAC_BU_ORDER_INFO TOI   left join T_EAC_BU_SALE_GOOD_INFO TEC on TOI.SALE_PRO_ID = TEC.SALE_PRO_ID) TEMPSALE on TSI.SALE_PRO_ID = TEMPSALE.SALE_PRO_IDwhere TSI.CAR_ORIGIN_CODE= '000000008671c3180186829f41ad336f' ;                                

首先看看该sql的执行计划吧

Mysql一条多表关联SQL把CPU打爆了,如何优化

相关的表结构如下:

Mysql一条多表关联SQL把CPU打爆了,如何优化

Mysql一条多表关联SQL把CPU打爆了,如何优化

Mysql一条多表关联SQL把CPU打爆了,如何优化

分析:

先来看看正常情况下这条sql单次执行耗时为多少

Mysql一条多表关联SQL把CPU打爆了,如何优化

索引有缺失吗?

相关表的索引创建无大碍,关联字段与where谓词字段都已经创建好了索引。

Mysql一条多表关联SQL把CPU打爆了,如何优化

针对这条异常sql,我们还有优化的空间吗??

解读执行计划,扫描 表别名为 TOI的表,全表扫描估算数据量为514049, Extra  列为 NULL 没有任何的谓词过滤无效数据。扫描后的结果与 表别名为 TEC 的表 Using index (SALE_PRO_ID字段)进行关联。再与 表别名为 TSI 的表 Using where 使用谓词过滤后关联。

Mysql一条多表关联SQL把CPU打爆了,如何优化

执行耗时绝大部分耗时都在第一步与第二步,即 from T_EAC_BU_ORDER_INFO TOI   left join T_EAC_BU_SALE_GOOD_INFO TEC on TOI.SALE_PRO_ID = TEC.SALE_PRO_ID ,在不影响语义的前提下,

我们改写sql把能过滤大部分数据的谓词表提前作为驱动表执行,这样就能最大程度提高执行效率,缩短执行时间了。即,我们将原本 T_EAC_BU_ORDER_INFO 与 T_EAC_BU_SALE_GOOD_INFO 无谓词的关联,改写为 T_EAC_BU_ORDER_INFO 与 T_EAC_BU_SG_CO_INFO 带谓词关联。

Mysql一条多表关联SQL把CPU打爆了,如何优化

改写后的sql

Mysql一条多表关联SQL把CPU打爆了,如何优化

未优化前sql与优化后sql执行时间对比

Mysql一条多表关联SQL把CPU打爆了,如何优化

未优化前sql与优化后sql执行计划对比

Mysql一条多表关联SQL把CPU打爆了,如何优化

至此,原本执行耗时由9秒+的问题sql,优化至0.00秒,性能提升杠杠的。

总结:

1、多表关联,表谓词能提前的提前过滤无效数据

2、多表关联,小表驱动大表

3、大部分sql优化为最佳索引缺失,部分sql优化需要改写sql文章来源地址https://www.toymoban.com/news/detail-410971.html

到了这里,关于Mysql一条多表关联SQL把CPU打爆了,如何优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL的多表关联查询

    多表关联查询是使用一条SQL语句,将关联的多张表的数据查询出来。 交叉查询就是将多张表的数据没有条件地连接在一起进行展示。 1.1.1 语法 使用交叉查询类别和商品 通过查询结果可以看到,交叉查询其实是一种错误的做法,在查询到的结果集中有大量的错误数据,称交叉

    2024年02月14日
    浏览(29)
  • Mysql的学习与巩固:一条SQL查询语句是如何执行的?

    我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个ID字段,在执行下面这个查询语句时:

    2023年04月13日
    浏览(71)
  • 一条SQL如何被MySQL架构中的各个组件操作执行的?

    简单用一张图说明下, MySQL 架构有哪些组件,接下来给大家用 SQL 语句分析 假如 SQL 语句是这样 SELECT class_no FROM student WHERE name = \\\'lcy\\\' AND age 18 GROUP BY class_no 其中 name 为索引,我们按照 时间顺序 来分析一下 客户端:客户端(如 MySQL 命令行工具、 Navicat 、 MySQL Workbench 或其他应

    2023年04月22日
    浏览(39)
  • MYSQL实战45讲笔记--基础架构:一条SQL查询语句是如何执行的?

    MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层 :连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等

    2024年02月07日
    浏览(36)
  • MySQL多表关联查询练习题

    1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); 创建score表。SQL代码如下: CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT , stu_id INT(10) NOT NULL , c_name VARCHAR(20) , grad

    2024年01月17日
    浏览(34)
  • sql Left Join 关联多条数据情况下只取一条数据

    存在b表中foreign_key多条关联a表中的id 需要只取b表中的一条数据(例如取最新的时间的一条) 1.解决方式:使用ROW_NUMBER () over()新增一列编号,排序后对新增列进行筛选 2.解决方式:使用listagg函数多列转一行,再结合substr函数截取最后一条

    2024年02月06日
    浏览(32)
  • MySQL多表关联on和where速度对比实测谁更快

    今天发现有人在讨论:两张MySQL的数据表按照某一个字段进行关联的时候查询,我们使用on和where哪种查询方式更快。 百闻不如一见,我们来亲自测试下。 Where、对等查询的join速度基本一致,不对等查询时一般join更慢。 我们有两张表,分别是member和member_class,数据结构如下图

    2024年02月08日
    浏览(35)
  • 一条指令在CPU里如何执行?

    本人才疏学浅,如果我的内容有明显的错误,或者有疑问的地方,衷心希望您能和我联系,给出建议和指导,或者与我交流相关知识。我会对你表示无限的感激!欢迎指正! “灵魂画手”上线: 老师上周单独布置给我的任务:让我去搞清楚“ 一条指令在cpu里是如何执行的呢

    2023年04月15日
    浏览(39)
  • 生产问题(十四)K8S抢占CPU导致数据库链接池打爆

            线上一天出现了两次数据库连接失败的大量报错,一开始以为是数据库的问题,但是想了想如果是数据库的问题,应该会有大量的应用问题         具体分析之后,发现其实是容器cpu出现了Throttled,导致大量线程阻塞         既然出现了报错,又没有发布,先

    2024年01月25日
    浏览(79)
  • MySQL 中一条 SQL 的查询与更新

      大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。   Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包