参照 指南:MySQL&MariaDBOnlineDDL
MySQL教程栏目介绍引导MySQL & MariaDB Online DDL。
二级索引
操纵 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
新建或者增加二级索引 | ? | ? | ? | ? | ? |
删除索引 | ? | ? | ? | ? | ? |
重命名索引 (??MySQL 5.7+,MariaDB 10.5.2+) | ? | ? | ? | ? | ? |
增加 FULLTEXT 索引 | ? | ? ① | ? ① | ? | ? |
增加 SPATIAL 索引(??MySQL 5.7+,MariaDB 10.2.2+) | ? | ? | ? | ? | ? |
修改索引类型 | ? | ? | ? | ? | ? |
注明:
- ① 首先次增加全文索引字段时需要重建表,之后就不需要了
主键
操纵 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
增加主键 | ? | ? ② | ? ② | ? | ? |
删除主键 | ? | ? | ? | ? | ? |
删除一个主键同时增加一个新的 | ? | ? | ? | ? | ? |
注明:
- 重建聚簇索引总是需要拷贝表数据(InnoDB 是“索引组织表”),所以最佳是在新建表的时候就定义好主键
- 要是新建表是没有指定主键,InnoDB 会选中首先个
NOT NULL
的UNIQUE
索引作为主键,或者运用系统生成的 KEY - ② 对聚簇索引来说,运用
INPLACE
模式比COPY
模式要高效一些:不会发生 undo log 和 redo log,二级索引是有序的,所以可以按次序加载,不需要运用变动缓冲区
普通列
操纵 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
列增加 | ? ③ | ? | ? ③ | ? ③ | ? |
列删除 | ? ④ | ? | ? | ? | ? |
列重命名 | ? | ? | ? | ? ⑤ | ? |
转变列的次序 | ? ? | ? | ? | ? | ? |
设定默许值 | ? | ? | ? | ? | ? |
修改数据类型 | ? | ? | ? | ? | ? |
扩展 VARCHAR 长度(??MySQL 5.7+, MariaDB 10.2.2+) | ? ? | ? | ? ⑥ | ? | ? |
删除列的默许值 | ? | ? | ? | ? | ? |
转变自增值 | ? | ? | ? | ? | ? ⑦ |
设定列为 NULL | ? | ? | ? ⑧ | ? | ? |
设定列为 NOT NULL | ? | ? ⑨ | ? ⑨ | ? | ? |
修改 ENUM 和 SET 列的定义 | ? | ? | ? ⑩ | ? | ? |
注明:
③ 并发 DML:当插入一个自增列时,不支撑并发的 DML 操纵,增加自增列时,批量的数据会被从新组织,代价昂扬
③ 重建表:增加列时,MySQL 5.7及以前版本需要重建表,MySQL 8.0 当
ALGORITHM=INPLACE
时,需要重建表,ALGORITHM=INSTANT
时不需要重建③ INSTANT算法:增加列时,运用
INSTANT
算法有下面这些限定- 增加列操纵不克不及和其它不支撑
INSTANT
算法的操纵合并为一条ALTER TABLE
语句 - 新增的列只能增加到表的最后,不克不及放到其它列的前面,在 MariaDB 10.4 之后,支撑在任意位置增加
- 不克不及将列增加到
ROW_FORMAT=COMPRESSED
的表中 - 不克不及将列增加到包括
FULLTEXT
的表中 - 不克不及将列增加来临时表中,暂时表只支撑
ALGORITHM=COPY
- 不克不及将列增加到驻留在数据字典表空间中的表中
- 在增加列的时候不会盘算行的大小限定,该限定在施行 DML 操纵插入或者更新表时才会被检查
- 增加列操纵不克不及和其它不支撑
④ 删除列时,批量的数据需要被从新组织,代价昂扬,在 MariaDB 10.4 之后,删除列支撑 INSTANT 算法
⑤ 重命名列时,确保只转变列名,不转变数据类型,这样才干支撑并发的 DML 操纵
⑥ 扩展 VARCHAR 长度时,INPLACE 是有前提的,必需保障用于标识字符串长度的长度字节不变(这里说的都是字节,不是 VARCHAR 的字符长度,字节占用与采纳的字符集有关,
utf8
字符集下,一个字符占 3 个字节,utf8mb4
则 4 个字节)- 当 VARCHAR 列长度在 0-255 个字节时,长度标识占用一个字节
- 当 VARCHAR 列长度大于 255 个字节时,长度标识占用两个字节
因而,INPLACE 只支撑 0-255 个字节之间或者 256 个字节到更大的长度之间的变动。VARCHAR 列长度减小是不支撑 INPLACE 的。
⑦ 自增列值变动是修改的内存中的值,不是数据文件
⑧ ⑨ 设定列为
[NOT] NULL
时,批量的数据被从新组织,代价昂扬⑩ 修改
ENUM
和SET
类型的列定义时,可否需要表拷贝取决于已有元素的个数和插入成员的位置? 在 MariaDB 10.4 之后,列排序支撑 INSTANT 算法
? 在 MariaDB 10.4.3 之后,InnoDB 支撑运用 INSTANT 算法添加列的长度,但是也有一些限定,具体参照 Changing the Data Type of a Column
生成列
操纵 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
增加 STORED 列 | ? | ? | ? | ? | ? |
修改 STORED 列的排序 | ? | ? | ? | ? | ? |
删除 STORED 列 | ? | ? | ? | ? | ? |
增加 VIRTUAL 列 | ? | ? | ? | ? | ? |
修改 VIRTUAL 列的排序 | ? | ? | ? | ? | ? |
删除 VIRTUAL 列 | ? | ? | ? | ? | ? |
外键
操纵 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
增加外键束缚 | ? | ? ? | ? | ? | ? |
删除外键束缚 | ? | ? | ? | ? | ? |
注明:
- ? 增加外键时,只要当
foreign_key_checks
选项被禁用的时候才支撑INPLACE
算法
表
操纵 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
修改 ROW_FORMAT | ? | ? | ? | ? | ? |
修改 KEY_BLOCK_SIZE | ? | ? | ? | ? | ? |
设定耐久表统计信息 | ? | ? | ? | ? | ? |
指定字符集 | ? | ? | ? ? | ? | ? |
转换字符集 | ? | ? | ? ? | ? | ? |
优化表 | ? | ? ? | ? | ? | ? |
运用 FORCE 选项重建表 | ? | ? ? | ? | ? | ? |
施行空的重建 | ? | ? ? | ? | ? | ? |
重命名表 | ? | ? | ? | ? | ? |
注明:
- ?? 当字符集不一样时,需要重建表
- ??? 要是表中包括
FULLTEXT
的字段,则不支撑 INPLACE
表空间
操纵 | INSTANT | INPLACE | 重建表 | 并发 DML | 只修改元数据 |
---|---|---|---|---|---|
重命名通例表空间 | ? | ? | ? | ? | ? |
启用或者禁用通例表空间加密 | ? | ? | ? | ? | ? |
启用或者禁用 file-per-table 表空间加密 | ? | ? | ? | ? | ? |
限定
- 在暂时表
TEMPORARY TABLE
上新建索引时会产生表拷贝 - 要是表上有
ON...CASCADE
或者ON...SET NULL
束缚,则ALERT TABLE
不支撑字句LOCK=NONE
- 在 Onlne DDL 操纵完成以前,它必需期待相干表已经持有元数据锁的事务提交或者回滚,在这个历程中,相干表的新事务会被阻塞,没法施行
- 当在大表上施行波及到表重建的 DDL 时,会存在下列限定
- 没有任何机制可以暂停 Online DDL操纵或限定 Online DDL 操纵的 I/O 或CPU运用率
- 要是操纵失败,则回滚 Online DDL操纵的代价非常昂扬
- 长工夫运转的 Online DDL 可能会致使复制推迟。 Online DDL 操纵必需在 Master 上施行完成后才干在 Slave 上施行,在这个历程中, 并发处置的 DML 在 Slave 上面必需期待 DDL 操纵完成后才会施行。
写在最后
本文将会延续批改和更新,更多出色内容请 follow me。
更多相干免费学习举荐:mysql教程(视频)
以上就是参照 指南:MySQL & MariaDB Online DDL的细致内容,更多请关注 百分百源码网 其它相干文章!