当前位置: 首页 > news >正文

MySQL在线DDL操作指南

MySQL的在线数据定义语言(DDL)操作允许在对数据库对象进行结构修改时,最大限度减少对数据库可用性的影响,保证业务的连续性。本文将深入分析MySQL中各类在线DDL操作的支持情况、语法示例以及使用注意事项。

一、索引操作

(一)支持情况概述

MySQL对多种索引操作提供了在线支持,具体信息如下:

操作原地操作重建表允许并发DML仅修改元数据
创建或添加二级索引
删除索引
重命名索引
添加FULLTEXT索引是*否*
添加SPATIAL索引
更改索引类型

(二)语法与使用说明

  1. 创建或添加二级索引:可以使用CREATE INDEXALTER TABLE ADD INDEX语句。在创建索引期间,表仍可进行读写操作,并且索引创建完成时会反映表的最新内容。若服务器在创建过程中退出,恢复时会删除部分创建的索引,需重新执行创建语句。
  2. 删除索引:使用DROP INDEXALTER TABLE DROP INDEX语句,删除索引时表可继续进行读写操作。
  3. 重命名索引:使用ALTER TABLE... RENAME INDEX语句,并指定ALGORITHM=INPLACELOCK=NONE
  4. 添加FULLTEXT索引:首次添加FULLTEXT索引且表中没有用户定义的FTS_DOC_ID列时会重建表,后续添加通常无需重建表。
  5. 添加SPATIAL索引:使用CREATE TABLEALTER TABLE ADD SPATIAL INDEX语句,并指定ALGORITHM=INPLACELOCK=SHARED
  6. 更改索引类型:使用ALTER TABLE语句,先删除原索引,再添加新类型的索引,并指定ALGORITHM=INPLACE

二、主键操作

(一)支持情况概述

操作原地操作重建表允许并发DML仅修改元数据
添加主键
删除主键
删除主键并添加另一个

(二)语法与使用说明

  1. 添加主键:使用ALTER TABLE ADD PRIMARY KEY语句,并指定ALGORITHM=INPLACELOCK=NONE。但在某些情况下,如列需要转换为NOT NULL时,可能不允许使用ALGORITHM=INPLACE。添加主键时,MySQL会检查列中是否存在重复值和NULL值。
  2. 删除主键:使用ALTER TABLE DROP PRIMARY KEY语句,并指定ALGORITHM=COPY
  3. 删除主键并添加另一个:使用ALTER TABLE DROP PRIMARY KEY, ADD PRIMARY KEY语句,并指定ALGORITHM=INPLACELOCK=NONE。此操作会大幅重组数据,较为昂贵。

三、列操作

(一)支持情况概述

操作原地操作重建表允许并发DML仅修改元数据
添加列是*
删除列
重命名列是*
重新排序列
设置列默认值
更改列数据类型
扩展VARCHAR列大小
删除列默认值
更改自增数值否*
使列可为NULL是*
使列不可为NULL是*是*
修改ENUM或SET列定义

(二)语法与使用说明

  1. 添加列:使用ALTER TABLE ADD COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE。添加自增列时不允许并发DML。
  2. 删除列:使用ALTER TABLE DROP COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE
  3. 重命名列:使用ALTER TABLE CHANGE语句,并指定ALGORITHM=INPLACELOCK=NONE。保持数据类型和[NOT] NULL属性不变时,可支持并发DML。
  4. 重新排序列:使用CHANGEMODIFY操作中的FIRSTAFTER关键字,并指定ALGORITHM=INPLACELOCK=NONE
  5. 更改列数据类型:使用ALTER TABLE CHANGE语句,并指定ALGORITHM=COPY
  6. 扩展VARCHAR列大小:使用ALTER TABLE CHANGE COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE。但需注意长度字节的限制。
  7. 设置列默认值:使用ALTER TABLE ALTER COLUMN SET DEFAULT语句,并指定ALGORITHM=INPLACELOCK=NONE
  8. 删除列默认值:使用ALTER TABLE ALTER COLUMN DROP DEFAULT语句,并指定ALGORITHM=INPLACELOCK=NONE
  9. 更改自增数值:使用ALTER TABLE AUTO_INCREMENT=next_value语句,并指定ALGORITHM=INPLACELOCK=NONE
  10. 使列可为NULL:使用ALTER TABLE MODIFY COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE
  11. 使列不可为NULL:使用ALTER TABLE MODIFY COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE。需启用STRICT_ALL_TABLESSTRICT_TRANS_TABLES SQL模式,且列中不能包含NULL值。
  12. 修改ENUM或SET列定义:使用ALTER TABLE MODIFY COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE。在不改变存储大小的情况下,可添加新成员。

四、生成列操作

(一)支持情况概述

操作原地操作重建表允许并发DML仅修改元数据
添加STORED列
修改STORED列顺序
删除STORED列
添加VIRTUAL列
修改VIRTUAL列顺序
删除VIRTUAL列

(二)语法与使用说明

  1. 添加STORED列:使用ALTER TABLE ADD COLUMN语句,并指定ALGORITHM=COPY。因为服务器需要评估表达式,所以不是原地操作。
  2. 修改STORED列顺序:使用ALTER TABLE MODIFY COLUMN语句,并指定ALGORITHM=COPY
  3. 删除STORED列:使用ALTER TABLE DROP COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE
  4. 添加VIRTUAL列:对于非分区表,使用ALTER TABLE ADD COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE。但不能与其他ALTER TABLE操作组合。对于分区表,不是原地操作。
  5. 修改VIRTUAL列顺序:使用ALTER TABLE MODIFY COLUMN语句,并指定ALGORITHM=COPY
  6. 删除VIRTUAL列:对于非分区表,使用ALTER TABLE DROP COLUMN语句,并指定ALGORITHM=INPLACELOCK=NONE。但不能与其他ALTER TABLE操作组合。对于分区表,不是原地操作。

五、外键操作

(一)支持情况概述

操作原地操作重建表允许并发DML仅修改元数据
添加外键约束是*
删除外键约束

(二)语法与使用说明

  1. 添加外键约束:当foreign_key_checks禁用时,支持INPLACE算法,否则仅支持COPY算法。使用ALTER TABLE ADD CONSTRAINT语句。
  2. 删除外键约束:使用ALTER TABLE DROP FOREIGN KEY语句。也可在同一语句中删除外键及其关联索引。可通过SHOW CREATE TABLE或查询Information Schema TABLE_CONSTRAINTS表获取外键约束名称。

六、表操作

(一)支持情况概述

操作原地操作重建表允许并发DML仅修改元数据
更改ROW_FORMAT
更改KEY_BLOCK_SIZE
设置持久表统计信息
指定字符集
转换字符集
优化表
使用FORCE选项重建表
执行空重建
重命名表

(二)语法与使用说明

  1. 更改ROW_FORMAT:使用ALTER TABLE ROW_FORMAT = row_format语句,并指定ALGORITHM=INPLACELOCK=NONE。此操作会大幅重组数据。
  2. 更改KEY_BLOCK_SIZE:使用ALTER TABLE KEY_BLOCK_SIZE = value语句,并指定ALGORITHM=INPLACELOCK=NONE。此操作会大幅重组数据。
  3. 设置持久表统计信息选项:使用ALTER TABLE STATS_PERSISTENT=0, STATS_SAMPLE_PAGES=20, STATS_AUTO_RECALC=1语句,并指定ALGORITHM=INPLACELOCK=NONE。此操作仅修改表元数据。
  4. 指定字符集:使用ALTER TABLE CHARACTER SET = charset_name语句,并指定ALGORITHM=INPLACELOCK=NONE。若新字符编码不同,会重建表。
  5. 转换字符集:使用ALTER TABLE CONVERT TO CHARACTER SET charset_name语句,并指定ALGORITHM=COPY。若新字符编码不同,会重建表。
  6. 优化表:使用OPTIMIZE TABLE语句。对于包含FULLTEXT索引的表,不支持原地操作,且不允许使用ALGORITHMLOCK语法。
  7. 使用FORCE选项重建表:使用ALTER TABLE FORCE语句,并指定ALGORITHM=INPLACELOCK=NONE。自MySQL 5.6.17起支持ALGORITHM=INPLACE,但对于包含FULLTEXT索引的表不支持。
  8. 执行空重建:使用ALTER TABLE ENGINE=InnoDB语句,并指定ALGORITHM=INPLACELOCK=NONE。自MySQL 5.6.17起支持ALGORITHM=INPLACE,但对于包含FULLTEXT索引的表不支持。
  9. 重命名表:使用ALTER TABLE RENAME TO语句,并指定ALGORITHM=INPLACELOCK=NONE。也可使用RENAME TABLE语句。重命名表时,需手动更改授予原表的特权。

七、表空间操作

(一)支持情况概述

操作原地操作重建表允许并发DML仅修改元数据
启用或禁用文件表空间加密

(二)语法与使用说明

使用ALTER TABLE ENCRYPTION='Y'语句,并指定ALGORITHM=COPY。加密仅支持文件表空间。

八、分区操作

(一)支持情况概述

多数ALTER TABLE分区子句不通过与常规非分区InnoDB表相同的内部在线DDL API,因此其在线支持情况有所不同。以下是部分分区操作的在线状态:

分区子句原地操作允许DML备注
PARTITION BY允许ALGORITHM=COPY,`LOCK={DEFAULT
ADD PARTITION仅允许ALGORITHM=DEFAULTLOCK=DEFAULT。对于按RANGE或LIST分区的表,不复制现有数据。对于按HASH或LIST分区的表,允许并发查询,MySQL在复制数据时持有共享锁
DROP PARTITION仅允许ALGORITHM=DEFAULTLOCK=DEFAULT。对于按RANGE或LIST分区的表,不复制现有数据
DISCARD PARTITION仅允许ALGORITHM=DEFAULTLOCK=DEFAULT
IMPORT PARTITION仅允许ALGORITHM=DEFAULTLOCK=DEFAULT
TRUNCATE PARTITION不复制现有数据,仅删除行,不改变表或其分区的定义
COALESCE PARTITION仅允许ALGORITHM=DEFAULTLOCK=DEFAULT。对于按HASH或LIST分区的表,允许并发查询,MySQL在复制数据时持有共享锁
REORGANIZE PARTITION仅允许ALGORITHM=DEFAULTLOCK=DEFAULT。对于按LINEAR HASH或LIST分区的表,允许并发查询,MySQL在复制受影响分区的数据时持有共享元数据锁
EXCHANGE PARTITION
ANALYZE PARTITION
CHECK PARTITION
OPTIMIZE PARTITIONALGORITHMLOCK子句被忽略,重建整个表
REBUILD PARTITION仅允许ALGORITHM=DEFAULTLOCK=DEFAULT。对于按LINEAR HASH或LIST分区的表,允许并发查询,MySQL在复制受影响分区的数据时持有共享元数据锁
REPAIR PARTITION
REMOVE PARTITIONING允许ALGORITHM=COPY,`LOCK={DEFAULT

(二)语法与使用说明

非分区在线ALTER TABLE操作对分区表遵循与常规表相同的规则,但会对每个表分区执行在线操作,可能增加系统资源需求。如需了解更多关于ALTER TABLE分区子句的信息,可参考相关文档。

通过深入了解MySQL的在线DDL操作,开发者和数据库管理员能够在保证数据库可用性的前提下,灵活、高效地对数据库结构进行调整,满足业务发展的需求。

相关文章:

  • 安全框架SpringSecurity入门
  • Window C++ Postmortem Debugger
  • opencv(C++)图像的读写、翻转、绘制、鼠标事件
  • 源码分析之Leaflet中control模块Control基类实现原理
  • Vue2 通过 Object.defineProperty 对哪些数组进行了特殊处理?
  • C语言中的内存管理:掌握动态分配的技巧
  • 雪花算法生成的主键存在哪些问题,为什么不能使用自增ID或者UUID做MySQL的主键
  • git 对比两种优化方法的性能
  • MySQL主从复制(二)
  • Go语言入门指南:从语法基础到核心特性解析
  • 【C++】mapset使用与实战 OJ题
  • ABAP RANGE表 OPTION 运算符 SIGN
  • 无人机数据链技术及运行方式详解!
  • python生成并绘制各种类型声音噪声
  • xfreerdp 的使用
  • Spring的 init-method, @PostConstruct, InitializingBean 对比
  • 【鸿蒙5.0】两个数组,点击事件两个数组数据进行了双向数据交换,双向绑定的原理是什么?
  • JVM——模型分析、回收机制
  • 学透Spring Boot — 007. 加载外部配置
  • 【蓝桥杯14天冲刺课题单】Day 8
  • 新造古镇丨上海古镇朱家角一年接待164万境外游客,凭啥?
  • 深圳宝安区一宗涉宅用地中止出让,起始总价86.27亿元
  • 多地征集农村假冒伪劣食品违法线索,全链条整治“三无”产品
  • 第三款在美获批的国产PD-1肿瘤药来了,影响多大?
  • 特朗普称已为俄乌问题设最后期限,届时美国态度或生变
  • 上海黄浦一季度实到外资总量全市第二,同比增速领先全市