mysql数据库子查询的使用_MySQL数据库使用子查询方式更新数据优化及思考
【环境介绍】
云数据库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数据库使用子查询方式更新数据优化及思考相关推荐
- mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...
mysql数据库优化课程---12.mysql嵌套和链接查询(查询user表中存在的所有班级的信息?) 一.总结 一句话总结: in:distinct:select * from class wher ...
- mysql获取查询策略语句_MySQL数据库查询性能优化策略
优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...
- mysql集合查询的命令_MySQL数据库常用命令集合
1.设置root密码 方法1: 用SET PASSWORD命令 mysql -u root SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpas ...
- mysql 姓刘或姓李_MYSQL数据库查询
作为测试人员最常用的数据库查询语句,本篇博文做了一个具体的总结,以下只是为了概述查询方法而举的例子,并不一定是最好的查询方式. 红色标记的地方是该查询语句中重点想要表达的查询方法. 一. 新建一个数据 ...
- mysql数据库条件语句怎么写_Mysql数据库的条件查询语句
对于分析人员来讲,Mysql数据库应用最多的是select查询语句,此篇文章主要介绍Mysql数据库的查询语句. 一.单表查询 1.带条件的查询 基本语法:select * from +表名称 +wh ...
- mysql存储过程查询所有表_mysql存储过程利用游标查询每个数据库的所有表
DELIMITER $ DROP PROCEDURE listAllDB; CREATE PROCEDURE listAllDB() BEGIN DECLARE no_more_record INT ...
- mysql数据库建站教程视频_Mysql数据库零基础到精通视频教程(共6天)
php教程 当前位置:主页 > php教程 > Mysql数据库零基础到精通视频教程(共6天) Mysql数据库零基础到精通视频教程(共6天) 教程大小:886MB 发布时间:2016 ...
- mysql中怎么查询单行单列_MySql中的子查询-结果单行单列
MySQL是开源免费和功能多面的小型数据库,MySQL也是目前流行通用的关系型数据库,已经被 Oracle 收购了.随着版本更新升级,加入一些高级功能,MySQL6.x 版本也开始收费.不过本教程将使 ...
- mysql 一个字段走索引吗_mysql数据库--explain(查询表是否走索引)各个字段含义...
1.1 id列 数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 1.2 select_type列 常见的有: ◆ simp ...
最新文章
- 信号量,互斥锁,条件变量的联系与区别
- Linux下编辑器vi/vim的使用介绍
- bos开发时,测试卡在登录界面解决
- Shift register(RAM-based)------ALTSHIFT_TAPS
- PHP设计模式之适配器模式
- linux启动mysql_Linux服务器安装Mysql教程
- org.dom4j.DocumentException: null Nested exception: null解决方法
- ROS + OpenCV
- linux stoping redis,redis的cluster集群模式shell一键启动/停止/重启/清缓存脚本
- 使用Ahk2Exe工具将AutoHotKey脚本打包到Windows可执行文件
- python 密码安全_python密码安全程序
- win10系统打开tftp服务器,win10系统开启TFTp的操作方法
- 网络安全实验室(基础关)
- Flash 3D引擎收集
- JavaScript高级程序设计(读书笔记)(七)
- 【课程·研】高级人工智能 | MOOC习题及课后作业:期末考试
- 平面设计好学吗?没有基础学平面设计难吗?
- 大雁塔尺寸_西安容易被误解的两座建筑 不是只有大小之分 游客来了才知道原因...
- 鼠标点击特效(富强,民主,文明,和谐,诚信,友善)
- Linux 中的分区魔术师-parted magic
热门文章
- 如何在vue-router的beforeEach钩子里做页面访问权限验证
- mysql 选择插入语句_带有last_insert_id()的Mysql多行插入 – 选择语句
- lisp调用qleader端点_标注时自动切换到DIM图层 lisp程序
- LG P990开机黑屏,但能进入系统的解决办法
- mysql 命令 pdf_MySQL命令文档 PDF 下载
- python双等号怎么输入_python中的星号‘*’和双星号‘**’的解说
- 计算机工程学院运动会方阵口号,关于校运会的方阵口号
- 1-2-3 CodeForces - 863C(规律+思维)
- python台风动图绘制_使用Python绘制台风轨迹图的示例代码
- mybatis 动态传入表名 注解_mybatis动态sql(注解方式)