热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

参考指南:MySQL&MariaDBOnlineDDL

MySQL教程栏目介绍指导MySQL&MariaDBOnlineDDL。

MySQL教程栏目介绍指导MySQL & MariaDB Online DDL。

二级索引

操作INSTANTINPLACE重建表并发 DML只修改元数据
创建或者添加二级索引
删除索引
重命名索引 (⚠️MySQL 5.7+,MariaDB 10.5.2+)
添加 FULLTEXT 索引✅ ①❌ ①
添加 SPATIAL 索引(⚠️MySQL 5.7+,MariaDB 10.2.2+)
修改索引类型

说明:

  • ① 第一次添加全文索引字段时需要重建表,之后就不需要了

主键

操作INSTANTINPLACE重建表并发 DML只修改元数据
添加主键✅ ②✅ ②
删除主键
删除一个主键同时添加一个新的

说明:

  • 重建聚簇索引总是需要拷贝表数据(InnoDB 是“索引组织表”),所以最好是在创建表的时候就定义好主键
  • 如果创建表是没有指定主键,InnoDB 会选择第一个 NOT NULLUNIQUE 索引作为主键,或者使用系统生成的 KEY
  • ② 对聚簇索引来说,使用 INPLACE 模式比 COPY 模式要高效一些:不会产生 undo logredo log,二级索引是有序的,所以可以按顺序加载,不需要使用变更缓冲区

普通列

操作INSTANTINPLACE重建表并发 DML只修改元数据
列添加✅ ③❌ ③✅ ③
列删除❌ ④
列重命名✅ ⑤
改变列的顺序❌ ⑫
设置默认值
修改数据类型
扩展 VARCHAR 长度(⚠️MySQL 5.7+, MariaDB 10.2.2+)❌ ⑬❌ ⑥
删除列的默认值
改变自增值❌ ⑦
设置列为 NULL✅ ⑧
设置列为 NOT NULL✅ ⑨✅ ⑨
修改 ENUMSET 列的定义❌ ⑩

说明:

  • ③ 并发 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 时,大量的数据被重新组织,代价高昂

  • ⑩ 修改 ENUMSET 类型的列定义时,是否需要表拷贝取决于已有元素的个数和插入成员的位置

  • ⑫ 在 MariaDB 10.4 之后,列排序支持 INSTANT 算法

  • ⑬ 在 MariaDB 10.4.3 之后,InnoDB 支持使用 INSTANT 算法增加列的长度,但是也有一些限制,具体参考 Changing the Data Type of a Column

生成列

操作INSTANTINPLACE重建表并发 DML只修改元数据
添加 STORED
修改 STORED 列的排序
删除 STORED
添加 VIRTUAL
修改 VIRTUAL 列的排序
删除 VIRTUAL

外键

操作INSTANTINPLACE重建表并发 DML只修改元数据
添加外键约束✅ ⑭
删除外键约束

说明:

  • ⑭ 添加外键时,只有当 foreign_key_checks 选项被禁用的时候才支持 INPLACE 算法

操作INSTANTINPLACE重建表并发 DML只修改元数据
修改 ROW_FORMAT
修改 KEY_BLOCK_SIZE
设置持久表统计信息
指定字符集✅ ⑮
转换字符集✅ ⑯
优化表✅ ⑰
使用 FORCE 选项重建表✅ ⑱
执行空的重建✅ ⑲
重命名表

说明:

  • ⑮⑯ 当字符集不同时,需要重建表
  • ⑰⑱⑲ 如果表中包含 FULLTEXT 的字段,则不支持 INPLACE

表空间

操作INSTANTINPLACE重建表并发 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的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 阿里云主机实战应用之centos7上的防火墙设置
    最近公司又上了一台服务器,以前都是用centos6系统,这次选择使用了centos7系统的安装镜像,因为现在程序版本在centos7上一般php默认就是5.4以上的,mysql也 ... [详细]
  • 数据库进入全新时代,腾讯云发布五大数据库提前布局
    8月28日,腾讯云数据库在京正式启动战略升级,宣布未来将聚焦云原生、自治、超融合三大战略方向,以用户为中心,联接未来。并在现场面向全球用户同步发布五大战略级新品,包括数据库智能管家 ... [详细]
  • MySQL/MariaDB/PerconaDB提权条件漏洞
    背景  2016年11月01日,国外安全研究员DawidGolunski在MyS ... [详细]
  • 如何部署Zabbix监控实现监测和报警机制
    这篇文章的知识点包括:Zabbix的安装部署、Zabbix监控的实现以及Zabbix报警机制的实现,阅读完整文相信大家对Zabbix监控的使用有了一定的认识。Zabb ... [详细]
  • mysql数据库生成表插件_screw 数据库文档生成工具
    简洁好用的数据库表结构文档工具在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是手写 ... [详细]
  • 1、MySQL标志说明MySQL的海豚标志的名字叫“sakila”,它是由MySQLAB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由 ... [详细]
  • MySQL for OPS 08:MHA 高可用
    MySQL for OPS 08:MHA 高可用 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了CentOS7编译mysql8.0.12相关的知识,希望对你有一定的参考价值。步骤一:安装 ... [详细]
  • MYsql_linux mysql
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了linuxmysql相关的知识,希望对你有一定的参考价值。一数据库安装查看:[[email pr ... [详细]
author-avatar
手机用户2602931635
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有