【环境介绍】

云数据库MySQL 5.7

【背景描述】

业务需要:需要对16370077的表数据进行更新部分数据操作

UPDATE P_MOXXXX_REXXXX SET FISAVAILABLE = 1 WHERE FREG_ID IN (SELECT FREG_ID FROM P_MOXXXX_REXXXX_UPDATE_TEMP);

【按照正常流程更新数据操作】

使用archery的SQL审核工具进行提单操作,操作超过10分多钟,最后使用kill会话暂停操作,

SQL为子查询更新数据操作,业务反馈查询数据很快,从更新操作看执行很久时间:

临时使用具体的条件值进行更新操作执行很快:

【分析更新慢问题】

从查看SQL看为子查询更新数据操作,查看官方对子查询的解释:

官方解释数据库子查询很明确,更新,删除数据不能使用到半连接或者优化子查询方式优化,建议使用连接方式执行SQL。

semijoin实现策略

业务反馈查询数据很快,查看对应的执行计划信息,从执行计划中就可以马上看出问题,扫描数据跟驱动表很大的差别:

查询的执行计

从执行计划看,临时表作为驱动表,使用索引主键,从extra列看,使用了semijoin Duplicate Weedout 策略优化子查询;

update的执行计划:

从执行计划看,不能优化成semijoin子查询,并且是一个相关子查询,会被优化器转为 exists相关子查询进行查询(select_type:DEPENDENT SUBQUERY),会根据外查询结果执行很多次;

【解决方法】

update/delete 无法使用 semijoin、materialization 优化策略,会以 exists 方式执行,外查询必须要进行全表扫描。

优化的方法,改成 join 即可方式更新数据操作;

查看执行计划及更新操作:

从执行时间看执行了15.34秒

【参考资料】

https://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html

https://opensource.actionsky.com/20200628-mysql/

https://opensource.actionsky.com/20210202-explain/

mysql数据库子查询的使用_MySQL数据库使用子查询方式更新数据优化及思考相关推荐

  1. mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...

    mysql数据库优化课程---12.mysql嵌套和链接查询(查询user表中存在的所有班级的信息?) 一.总结 一句话总结: in:distinct:select * from class wher ...

  2. mysql获取查询策略语句_MySQL数据库查询性能优化策略

    优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...

  3. mysql集合查询的命令_MySQL数据库常用命令集合

    1.设置root密码 方法1: 用SET PASSWORD命令 mysql -u root SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpas ...

  4. mysql 姓刘或姓李_MYSQL数据库查询

    作为测试人员最常用的数据库查询语句,本篇博文做了一个具体的总结,以下只是为了概述查询方法而举的例子,并不一定是最好的查询方式. 红色标记的地方是该查询语句中重点想要表达的查询方法. 一. 新建一个数据 ...

  5. mysql数据库条件语句怎么写_Mysql数据库的条件查询语句

    对于分析人员来讲,Mysql数据库应用最多的是select查询语句,此篇文章主要介绍Mysql数据库的查询语句. 一.单表查询 1.带条件的查询 基本语法:select * from +表名称 +wh ...

  6. mysql存储过程查询所有表_mysql存储过程利用游标查询每个数据库的所有表

    DELIMITER $ DROP PROCEDURE listAllDB; CREATE PROCEDURE listAllDB() BEGIN DECLARE no_more_record INT ...

  7. mysql数据库建站教程视频_Mysql数据库零基础到精通视频教程(共6天)

    php教程 当前位置:主页 > php教程 > Mysql数据库零基础到精通视频教程(共6天) Mysql数据库零基础到精通视频教程(共6天) 教程大小:886MB   发布时间:2016 ...

  8. mysql中怎么查询单行单列_MySql中的子查询-结果单行单列

    MySQL是开源免费和功能多面的小型数据库,MySQL也是目前流行通用的关系型数据库,已经被 Oracle 收购了.随着版本更新升级,加入一些高级功能,MySQL6.x 版本也开始收费.不过本教程将使 ...

  9. mysql 一个字段走索引吗_mysql数据库--explain(查询表是否走索引)各个字段含义...

    1.1 id列 数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 1.2 select_type列 常见的有: ◆ simp ...

最新文章

  1. 信号量,互斥锁,条件变量的联系与区别
  2. Linux下编辑器vi/vim的使用介绍
  3. bos开发时,测试卡在登录界面解决
  4. Shift register(RAM-based)------ALTSHIFT_TAPS
  5. PHP设计模式之适配器模式
  6. linux启动mysql_Linux服务器安装Mysql教程
  7. org.dom4j.DocumentException: null Nested exception: null解决方法
  8. ROS + OpenCV
  9. linux stoping redis,redis的cluster集群模式shell一键启动/停止/重启/清缓存脚本
  10. 使用Ahk2Exe工具将AutoHotKey脚本打包到Windows可执行文件
  11. python 密码安全_python密码安全程序
  12. win10系统打开tftp服务器,win10系统开启TFTp的操作方法
  13. 网络安全实验室(基础关)
  14. Flash 3D引擎收集
  15. JavaScript高级程序设计(读书笔记)(七)
  16. 【课程·研】高级人工智能 | MOOC习题及课后作业:期末考试
  17. 平面设计好学吗?没有基础学平面设计难吗?
  18. 大雁塔尺寸_西安容易被误解的两座建筑 不是只有大小之分 游客来了才知道原因...
  19. 鼠标点击特效(富强,民主,文明,和谐,诚信,友善)
  20. Linux 中的分区魔术师-parted magic

热门文章

  1. 如何在vue-router的beforeEach钩子里做页面访问权限验证
  2. mysql 选择插入语句_带有last_insert_id()的Mysql多行插入 – 选择语句
  3. lisp调用qleader端点_标注时自动切换到DIM图层 lisp程序
  4. LG P990开机黑屏,但能进入系统的解决办法
  5. mysql 命令 pdf_MySQL命令文档 PDF 下载
  6. python双等号怎么输入_python中的星号‘*’和双星号‘**’的解说
  7. 计算机工程学院运动会方阵口号,关于校运会的方阵口号
  8. 1-2-3 CodeForces - 863C(规律+思维)
  9. python台风动图绘制_使用Python绘制台风轨迹图的示例代码
  10. mybatis 动态传入表名 注解_mybatis动态sql(注解方式)