Case:update中把in改写成join性能提高数倍
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,(1)优化前如下一条SQL,把从1985-05-21入职前的员工薪资都增加500,执行约20.70 s,从执行计划中可以看出对表salaries进行的是索引全扫描,扫描行数约260W行。mysql>
千家信息网最后更新 2025年02月04日Case:update中把in改写成join性能提高数倍
(1)优化前
如下一条SQL,把从1985-05-21入职前的员工薪资都增加500,执行约20.70 s,
从执行计划中可以看出对表salaries进行的是索引全扫描,扫描行数约260W行。
mysql> update salaries set salary=salary+500 where emp_no in (select emp_no from employees where hire_date<='1985-05-21');Query OK, 151583 rows affected (20.70 sec)Rows matched: 151583 Changed: 151583 Warnings: 0mysql> desc update salaries set salary=salary+500 where emp_no in (select emp_no from employees where hire_date<='1985-05-21');+----+--------------------+-----------+------------+-----------------+---------------+---------+---------+------+---------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+--------------------+-----------+------------+-----------------+---------------+---------+---------+------+---------+----------+-------------+| 1 | UPDATE | salaries | NULL | index | NULL | PRIMARY | 7 | NULL | 2674458 | 100.00 | Using where || 2 | DEPENDENT SUBQUERY | employees | NULL | unique_subquery | PRIMARY | PRIMARY | 4 | func | 1 | 33.33 | Using where |+----+--------------------+-----------+------------+-----------------+---------------+---------+---------+------+---------+----------+-------------+2 rows in set, 1 warning (0.00 sec)
(2)优化后
把in改写成join后,虽然对employees是全表扫描,但是扫描行数近29W行,大大减少,所以SQL执行时间可以缩减到7.26s.
mysql> update salaries s join (select distinct e.emp_no from employees e where e.hire_date<='1985-05-21') e on s.emp_no=e.emp_no -> set s.salary=salary+500;Query OK, 151583 rows affected (7.26 sec)Rows matched: 151583 Changed: 151583 Warnings: 0mysql> desc update salaries s join (select distinct e.emp_no from employees e where e.hire_date<='1985-05-21') e on s.emp_no=e.emp_no -> set s.salary=salary+500;+----+-------------+------------+------------+------+----------------+---------+---------+----------+--------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+------------+------------+------+----------------+---------+---------+----------+--------+----------+-------------+| 1 | PRIMARY || NULL | ALL | NULL | NULL | NULL | NULL | 99827 | 100.00 | NULL || 1 | UPDATE | s | NULL | ref | PRIMARY,emp_no | PRIMARY | 4 | e.emp_no | 10 | 100.00 | NULL || 2 | DERIVED | e | NULL | ALL | PRIMARY | NULL | NULL | NULL | 299512 | 33.33 | Using where |+----+-------------+------------+------------+------+----------------+---------+---------+----------+--------+----------+-------------+3 rows in set, 1 warning (0.00 sec)
员工
时间
索引
薪资
行约
性能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全四个环节
vs2015 连接数据库
服务器还原电脑后
湖北省软件开发评标办法
吉大网络安全专业排名
网络技术对国家安全的影响
金乡网络安全监管
数据库知识app
空间相册点不开提示服务器繁忙
mq服务器连接通道
远程登录月旦数据库
淮南证券软件开发定制
无忧网络安全绘画
ava数据库分片技术
学习网络技术看那些书
计算机网络技术的题目
数据库的产生结果集
mysql数据库显示表不存在
2020国家网络安全会
服务器实体机hp
网络安全讲话精神法律法规
网络安全有哪些书籍推荐
ai怎么处理网络安全
杭州杭州app软件开发
远程登录月旦数据库
sql数据库缓存有哪几种
软件开发所要缴纳的税
软件开发工程师日语怎么说
数据库表设计怎么添加数据
计算机网络技术毕业论文方向