根本原因在于事务模型差异:InnoDB需MVCC、行锁、undo log维护一致性,MyISAM仅表锁无事务;前者安全但慢,后者快却易阻塞损坏。为什么大批量 UPDATE 在 InnoDB 里容易卡住,MyISAM 却"看起来快"?根本原因不在引擎"快慢",而在事务模型:InnoDB 是 MVCC + 行锁 + undo log,MyISAM 是表锁 + 无事务。执行 UPDATE 时,InnoDB 要为每一行生成新版本、维护回滚段、检查一致性读视图;MyISAM 直接加表锁、覆盖写磁盘------没有并发保护,自然"快",但业务一读就阻塞,且崩溃后极易损坏。MyISAM 的"快"只适用于只读+离线批量场景,线上业务绝对禁用InnoDB 的延迟常来自 undo 表空间不足、buffer pool 淘汰压力大、或长事务阻塞 purge 线程观察 SHOW ENGINE INNODB STATUS 中的 TRANSACTIONS 和 ROW OPERATIONS 区域能快速定位是锁争用还是 purge 延迟分批 UPDATE 必须控制的三个参数不是随便加 LIMIT 1000 就安全。真正影响稳定性的,是单批次的扫描范围、事务大小和 binlog 写入节奏。WHERE 条件必须走索引,否则每次 LIMIT 都要全表扫描前 N 行------2 亿数据下,第 100 批可能比第一批还慢 10 倍单事务建议控制在 5000--50000 行之间:batch_size = 10000 是较稳妥起点,超 10 万易触发 innodb_log_file_size 不足或主从延时突增每批执行后加 SLEEP(0.1)(非必要但推荐),避免 CPU/IO 持续打满,尤其在主从架构中可缓解 relay log 积压CASE WHEN 批量更新只适合"几百行",别硬撑几千UPDATE ... SET col = CASE WHEN id=1 THEN ... END WHERE id IN (...) 看似优雅,实际有隐性成本:MySQL 会把整个 CASE 表达式编译成内部跳转逻辑,id 列表越长,优化器决策时间越长,且该语句无法利用索引下推(ICP)。 RedClaw 百度推出的手机端万能AI Agent助手
相关推荐
风吹夏回1 天前
Python 全局异常处理:从“满屏 try-except”到优雅兜底小熊Coding1 天前
Python爬取当当网二手图书项目实战!企服AI产品测评局1 天前
Agent适配信创环境实测:企业级自动化如何实现国产操作系统与数据库全兼容?秋91 天前
Java项目运行5天左右自动宕机:系统性定位与解决方案小江的记录本1 天前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)cfm_29141 天前
Redis数据安全性解析DIY源码阁1 天前
JavaSwing学生成绩管理系统 - MySQL版田里的水稻1 天前
OE_ubuntu26.04与宿主机之间复制粘贴内容jiayong231 天前
02 创建虚拟环境NiceCloud喜云1 天前
Claude Code Routines 实战:三种触发器跑通云端自动化编码