mysql中执行UPDATE与DELETE语句的流程与优化
发布时间 - 2026-01-13 00:00:00 点击率:次UPDATE执行时先定位、加锁、写日志、再更新数据页,受引擎、索引和隔离级别影响;未走索引易致锁升级甚至全表扫描。
UPDATE 语句执行时到底发生了什么
MySQL 执行 UPDATE 不是简单地“改一行”,而是先定位、再加锁、再写日志、最后更新数据页。整个过程受存储引擎、索引、事务隔离级别共同影响。
常见错误现象:UPDATE 卡住、被阻塞、甚至触发全表扫描导致锁表——往往是因为没走索引或 WHERE 条件不精确。
- 必须确保
WHERE中的字段有有效索引,否则 InnoDB 会升级为行锁 → 表级锁(尤其在 RR 隔离级别下) - 避免在
WHERE中对字段做函数操作,比如WHERE YEAR(created_at) = 2025,这会让索引失效 - 批量更新尽量用主键或唯一索引定位,不要依赖非唯一二级索引(可能引发间隙锁冲突)
- 如果只更新少量字段,优先用
UPDATE ... SET col = ? WHERE pk = ?,避免无谓的字段重写和 undo 日志膨胀
DELETE 语句为什么比 SELECT 慢得多
DELETE 不仅要查数据,还要释放空间、维护索引、生成 undo/redo 日志,并可能触发外键检查与触发器。InnoDB 中删除不是物理擦除,而是标记为“可复用”,后续插入才可能覆盖。
典型问题:大表 DELETE 耗时长、磁盘 I/O 飙升、主从延迟加剧。
- 永远不要在没有
WHERE的DELETE FROM t上操作大表;清空用TRUNCATE TABLE t(但注意它会重置自增计数器且不可回滚) - 分批删除更安全:
DELETE FROM orders WHERE status = 'cancelled' ORDER BY id LIMIT 1000;
配合循环执行,每次提交事务,避免长事务拖慢 MVCC - 确认是否真需要删除:归档旧数据到历史表(
INSERT INTO archive_orders SELECT ...+DELETE)通常比直接删更可控 - 删除后若空间未回收,可能是
innodb_file_per_table = OFF或未执行OPTIMIZE TABLE(但该操作会锁表,生产慎用)
如何判断 UPDATE/DELETE 是否走索引
别猜,用 EXPLAIN 看执行计划。重点看 type、key、rows 和 Extra 字段。
-
type = ALL表示全表扫描,危险信号 -
key = NULL表示没用上索引 -
rows值远大于实际匹配行数,说明索引选择性差或统计信息过期(可运行ANALYZE TABLE t更新) -
Extra出现Using where; Using index condition是理想状态;出现Using filesort或Using temporary则说明语句结构可能诱发额外开销
注意:对 UPDATE 和 DELETE 使用 EXPLAIN 时,MySQL 5.6+ 支持直接解释(如 EXPLAIN UPDATE ...),低版本需改写为等价 SELECT 分析。
高并发下 UPDATE/DELETE 的锁行为差异
InnoDB 对 UPDATE 和 DELETE 默认加 next-key lock(记录锁 + 间隙锁),目的是防止幻读。但两者的锁范围和持续时间不同。
-
UPDATE只锁满足WHERE条件的行(及对应间隙),但如果更新了索引列,还可能触发二级索引记录的锁升级 -
DELETE同样锁匹配行,但因涉及索引树结构调整,锁持有时间略长,尤其在唯一索引冲突检测时可能短暂升级为意向锁等待 - 显式加锁(
SELECT ... FOR UPDATE)后再UPDATE,比直接UPDATE更容易暴露死锁,因为前者提前占锁,后者在执行路径中才加锁 - 避免在事务中混合
UPDATE和DELETE操作同一张表的不同子集,极易因锁顺序不一致引发死锁
真正难调的从来不是语法对不对,而是锁怎么加、什么时候放、谁在等谁——这些细节藏在 INFORMATION_SCHEMA.INNODB_TRX 和 SHOW ENGINE INNODB STATUS 里。
# mysql
# ai
# 为什么
# red
# NULL
# for
# select
# 循环
# using
# delete
# 并发
# table
# 死锁
# 加锁
# 升级为
# 是因为
# 什么时候
# 得多
# 重写
# 最后更新
# 藏在
# 更容易
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Android 常见的图片加载框架详细介绍
微信小程序制作网站有哪些,微信小程序需要做网站吗?
怎么用AI帮你为初创公司进行市场定位分析?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Laravel如何使用Livewire构建动态组件?(入门代码)
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
简历没回改:利用AI润色让你的文字更专业
Android滚轮选择时间控件使用详解
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
JS去除重复并统计数量的实现方法
如何在景安云服务器上绑定域名并配置虚拟主机?
如何在服务器上三步完成建站并提升流量?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
JS碰撞运动实现方法详解
Laravel安装步骤详细教程_Laravel环境搭建指南
如何用PHP快速搭建CMS系统?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel如何配置和使用缓存?(Redis代码示例)
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel如何自定义错误页面(404, 500)?(代码示例)
Linux系统命令中screen命令详解
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何用低价快速搭建高质量网站?
黑客如何通过漏洞一步步攻陷网站服务器?
python中快速进行多个字符替换的方法小结
音乐网站服务器如何优化API响应速度?
如何在橙子建站中快速调整背景颜色?
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
网站优化排名时,需要考虑哪些问题呢?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
js代码实现下拉菜单【推荐】
如何续费美橙建站之星域名及服务?
如何在Windows虚拟主机上快速搭建网站?
Python面向对象测试方法_mock解析【教程】
如何自定义建站之星网站的导航菜单样式?
如何在搬瓦工VPS快速搭建网站?


数据页,受引擎、索引和隔离级别影响;未走索引易致锁升级甚至全表扫描。