Mysql DDL中的ALGORITHM

在对大表进行结构调整(如加字段、建索引)时,ALGORITHM 用于指定 Online DDL(在线数据定义) 的执行方式,这直接决定了变更期间是否会锁表 以及性能如何

语法

sql 复制代码
ALTER TABLE table_name ALGORITHM = {DEFAULT | INSTANT | INPLACE | COPY}, ADD COLUMN ...

四种算法对照表

算法 (ALGORITHM) 速度 是否锁表(阻断写) 原理与特点
INSTANT (即时) 极快(毫秒级) 完全不锁表 仅修改元数据(Metadata)。不会动到任何实际的数据行。MySQL 8.0+ 引入,支持加/删列、修改列默认值等。
INPLACE (就地) 较快 不锁表(允许并发 DML 读写) 在存储引擎内部(如 InnoDB)原位重建或修改表空间文件,不经过服务器层复制。期间会将新写入的数据记录在日志中,最后一次性应用。
COPY (复制) 最慢 会锁表(期间只能读,不能写) 传统的变更方式。MySQL 会创建一张新结构的临时表,把原表数据逐行复制过去,完成后删除旧表并重命名新表。
DEFAULT (默认) 自动选择 视具体操作而定 让 MySQL 自动选择当前操作所支持的最高效 算法(优先级:INSTANT > INPLACE > COPY)。

实际应用建议

通常在生产环境操作大表时,为了防止长耗时导致业务瘫痪,建议显式指定算法。如果不确定该操作是否支持某种高性能算法,可以结合 LOCK 关键字进行测试:

sql 复制代码
-- 如果该操作不支持 INPLACE,MySQL 会直接报错,而不是默默降级为锁表的 COPY 算法
ALTER TABLE users ADD INDEX idx_status (status), ALGORITHM=INPLACE, LOCK=NONE;
相关推荐
z落落10 小时前
SQL 表的基本操作 数据库增删改查(CRUD)+SQL 进阶语法详解(标识列插入、模糊查询、Union、变量、运算、别名)
数据库·sql
代码的小搬运工13 小时前
网络请求(NSURL、NSURLRequest、NSURLSessionDataTask、协议回调与 JSON 数据的基本流向)
网络·数据库·json
Cx330❀18 小时前
【MySQL基础】一文吃透“表的约束”:从 Null/Default 到主外键的终极安全法则
linux·服务器·数据库·c++·mysql·安全
c2385619 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
大阳光男孩19 小时前
Spring Boot 整合 Debezium 实现 MySQL 增量数据监听(嵌入式版)
spring boot·后端·mysql
我科绝伦(Huanhuan Zhou)19 小时前
MySQL极端场景数据丢失防护:从Crash-Safe到异地备份
数据库·mysql
辞旧 lekkk19 小时前
【Redis初阶】常见数据类型
开发语言·数据库·c++·redis·学习·缓存·bootstrap
明志数科20 小时前
人形机器人格斗场景下的技术挑战:动力学控制、感知融合与实时决策
网络·数据库
酉鬼女又兒20 小时前
零基础入门 DeepSeek V4 Pro API 开发:从环境搭建、消息格式规范到翻译函数实战、少样本提示、多轮对话聊天机器人与常见报错全流程详解指南
大数据·网络·数据库·人工智能·macos·机器人·github
笨蛋不要掉眼泪20 小时前
MySQL架构揭秘:MVCC解决读一致性问题
数据库·mysql·架构