mysql锁竞争严重如何优化_MyISAM转InnoDB实战方案

张开发
2026/4/29 22:04:37 15 分钟阅读

分享文章

mysql锁竞争严重如何优化_MyISAM转InnoDB实战方案
MyISAM转InnoDB需停写操作并避开高并发期注意表锁、外键与NULL唯一索引冲突调大innodb_buffer_pool_size处理死锁重试逻辑修正业务层对MyISAM的惯性假设。MyISAM 表还在用先停掉写操作再转MyISAM 的表级锁在并发写入时会直接卡死转 InnoDB 不是「ALTER TABLE 一下就完事」。如果线上有持续 INSERT/UPDATEALTER TABLE 过程中表会被锁住其他写请求排队甚至超时尤其大表可能锁几十分钟。实操建议选业务低峰期操作提前用 SHOW PROCESSLIST 确认无长事务或慢查询占用该表对核心表先在从库上执行转换验证无误后再切主库避免用 mysqldump --no-create-info 手动改 CREATE 语句的方式——容易漏掉索引、AUTO_INCREMENT、字符集等细节转换前确认磁盘空间充足InnoDB 行格式如 ROW_FORMATDYNAMIC和 MVCC 机制会让数据文件比 MyISAM 大 20%–50%ALTER TABLE ENGINEInnoDB 卡住不动检查外键和唯一索引常见现象是命令一直显示 copy to tmp table 或卡在 rebuilding table不是性能问题而是隐性约束冲突。MyISAM 不校验外键但 InnoDB 会严格检查MyISAM 允许 NULL 值的列建唯一索引InnoDB 在 UNIQUE 索引中把多个 NULL 当作不同值但某些旧版本如 MySQL 5.6对含 NULL 的 UNIQUE 索引转换会异常等待。实操建议转换前跑一遍 SELECT COUNT(*) FROM table_name WHERE column_name IS NULL如果对应列上有 UNIQUE 索引先清理或改用普通索引禁用外键检查只对当前会话有效SET FOREIGN_KEY_CHECKS 0;但必须确保上下游表结构一致否则转完启用检查时会报错加 ALGORITHMINPLACEMySQL 5.6可跳过拷贝但仅限部分场景支持不确定时加 ALGORITHMCOPY 显式声明避免隐式降级导致意外锁表转完发现 SELECT 变慢重点调 innodb_buffer_pool_sizeInnoDB 依赖缓冲池缓存数据页MyISAM 直接读文件系统缓存。如果 innodb_buffer_pool_size 还沿用 MyISAM 时代的配置比如只设 128M热点数据全在磁盘上QPS 下跌明显尤其是 JOIN 多、范围扫描多的查询。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。

更多文章