0

0

mysql中执行UPDATE与DELETE语句的流程与优化

P粉602998670

P粉602998670

发布时间:2026-01-13 02:45:22

|

955人浏览过

|

来源于php中文网

原创

update执行时先定位、加锁、写日志、再更新数据页,受引擎、索引和隔离级别影响;未走索引易致锁升级甚至全表扫描。

mysql中执行update与delete语句的流程与优化

UPDATE 语句执行时到底发生了什么

MySQL 执行 UPDATE 不是简单地“改一行”,而是先定位、再加锁、再写日志、最后更新数据页。整个过程受存储引擎、索引、事务隔离级别共同影响。

常见错误现象:UPDATE 卡住、被阻塞、甚至触发全表扫描导致锁表——往往是因为没走索引或 WHERE 条件不精确。

  • 必须确保 WHERE 中的字段有有效索引,否则 InnoDB 会升级为行锁 → 表级锁(尤其在 RR 隔离级别下)
  • 避免在 WHERE 中对字段做函数操作,比如 WHERE YEAR(created_at) = 2024,这会让索引失效
  • 批量更新尽量用主键或唯一索引定位,不要依赖非唯一二级索引(可能引发间隙锁冲突)
  • 如果只更新少量字段,优先用 UPDATE ... SET col = ? WHERE pk = ?,避免无谓的字段重写和 undo 日志膨胀

DELETE 语句为什么比 SELECT 慢得多

DELETE 不仅要查数据,还要释放空间、维护索引、生成 undo/redo 日志,并可能触发外键检查与触发器。InnoDB 中删除不是物理擦除,而是标记为“可复用”,后续插入才可能覆盖。

典型问题:大表 DELETE 耗时长、磁盘 I/O 飙升、主从延迟加剧。

hstshop鸿思特商城系统
hstshop鸿思特商城系统

鸿思特商城系统HstShop是一款B2C独立网店系统,由拥有十年互联网开发经验的牛头带队开发完成,完全免费开源,适合大中型网站平台快速构建立强大的网上商城平台网店系统。HstShop悉心听取每一位商家的需求与建议,根据中国人的购物习惯改进了购物流程,实现更好的用户购物体验。HstShop网店系统无论在产品功能、稳定性、执行效率、负载能力、安全性和搜索引擎优化等方面都居国内同类产品领先地位,成为国内

下载
  • 永远不要在没有 WHEREDELETE 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 看执行计划。重点看 typekeyrowsExtra 字段。

  • type = ALL 表示全表扫描,危险信号
  • key = NULL 表示没用上索引
  • rows 值远大于实际匹配行数,说明索引选择性差或统计信息过期(可运行 ANALYZE TABLE t 更新)
  • Extra 出现 Using where; Using index condition 是理想状态;出现 Using filesortUsing temporary 则说明语句结构可能诱发额外开销

注意:对 UPDATEDELETE 使用 EXPLAIN 时,MySQL 5.6+ 支持直接解释(如 EXPLAIN UPDATE ...),低版本需改写为等价 SELECT 分析。

高并发下 UPDATE/DELETE 的锁行为差异

InnoDB 对 UPDATEDELETE 默认加 next-key lock(记录锁 + 间隙锁),目的是防止幻读。但两者的锁范围和持续时间不同。

  • UPDATE 只锁满足 WHERE 条件的行(及对应间隙),但如果更新了索引列,还可能触发二级索引记录的锁升级
  • DELETE 同样锁匹配行,但因涉及索引树结构调整,锁持有时间略长,尤其在唯一索引冲突检测时可能短暂升级为意向锁等待
  • 显式加锁(SELECT ... FOR UPDATE)后再 UPDATE,比直接 UPDATE 更容易暴露死锁,因为前者提前占锁,后者在执行路径中才加锁
  • 避免在事务中混合 UPDATEDELETE 操作同一张表的不同子集,极易因锁顺序不一致引发死锁

真正难调的从来不是语法对不对,而是锁怎么加、什么时候放、谁在等谁——这些细节藏在 INFORMATION_SCHEMA.INNODB_TRXSHOW ENGINE INNODB STATUS 里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

686

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

513

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

267

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

542

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

666

2023.08.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 847人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号