Case:update中把in改写成join性能提高数倍
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,(1)优化前如下一条SQL,把从1985-05-21入职前的员工薪资都增加500,执行约20.70 s,从执行计划中可以看出对表salaries进行的是索引全扫描,扫描行数约260W行。mysql>
千家信息网最后更新 2025年11月07日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安全错误
数据库的锁怎样保障安全
南京智能软件开发系统
图形数据库 排名
数据库中查看字段类型
access数据库辅助插件
朝阳区网络软件开发大概费用
网络技术行业社会调查报告
软件开发过程中的复用
如何打服务器
网络技术的迅速发展英语
bch网络安全吗
教职工宣传网络安全好的总结
网络安全等级保护机制内容
和平精英怎么使用第二个服务器
数据库查看登录sa密码
计算机网络安全防范手段
如何做好网络安全教育
网络安全观后感100字
二级分销系统软件开发公司
陌陌软件开发工程师
药店医保网络安全管理制度
网络安全协会第二次会员大会
英业达b810服务器管理ip
网络安全应急演练整改
国网网络安全体系
国家网络安全宣传证书
服务器送产权什么意思
加载服务器列表失败
数据库索引新技术
做网站和网络安全有什么关系
卡巴斯基服务器限制