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 飙升、主从延迟加剧。

  • 永远不要在没有 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 字段。

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

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

下载
  • 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 里。

相关专题

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

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

660

2023.06.20

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

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

245

2023.06.21

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

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

281

2023.07.18

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

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

514

2023.07.19

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

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

253

2023.07.25

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

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

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

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

528

2023.08.11

mysql忘记密码
mysql忘记密码

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

599

2023.08.14

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

10

2026.01.12

热门下载

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

精品课程

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

共48课时 | 1.7万人学习

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

共3课时 | 0.3万人学习

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

共1课时 | 787人学习

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

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