浅谈DDL技能解密
副问题[/!--empirenews.page--]
起首,用过数据库的小搭档们(本文以 MySQL InnoDB 为例)都知道,MySQL 不止有增编削数据操纵(DML),尚有改表布局的操纵(DDL),当新增进字段等修改表布局时,就必要举办 DDL 操纵。然则,假如对一个存储了上百万乃至上千上万的数据表举办 DDL 操纵,数据库是怎么做到的呢?会不会有一个很大的事宜锁?会不会影响数据的插入和更新?本日就会聊聊这个题目,以及 PT-OSC、GH-OST 等技能,是怎样高效的办理这个题目的。 Before MySQL 5.5 在 MySQL 5.5 版本及之前版本,DDL 操纵首要有 copy table 和 inplace 两种方法。 1. Copy Table 方法 Copy Table 顾名思义,就是通过姑且表拷贝的方法实现的。在 MySQL 5.5 版本及之前版本,修改表布局是表级锁,以是在整个 DDL 进程中表都是锁着不行写入的。这使得在修改时轻易导致数据库 CPU、IO 等机能的耗损,以及主从同步的耽误。 上述进程,MySQL 自动完成转存数据,互换表名和删除旧表等操纵,时刻耗损最多的是在往姑且表(Server 层)插入数据的进程,整个 DDL 进程中,表是不能执行 DML 的。 2. IN-Place 方法 在 MySQL 5.5 版本中,增进了 IN-Place 方法。所谓 IN-Place 方法,就是索引建设在原表上直接举办,不会 copy 整个表,只必要在原本的 idb 文件上,新建所必要的索引页,这比 Copy Table 节省极大的 IO 资源,且镌汰了 DDL 执行时长。 比拟 Copy Table 和 IN-Place 两种方法,我们看下官网的内容(MySQL 5.5): (引自:https://dev.mysql.com/doc/refman/5.5/en/alter-table.html) 以上是 MySQL 5.5 版本中的声名,而 MySQL 5.6 版本,则正式提出了 COPY 和 INPLACE 两种方法。 (引自:https://dev.mysql.com/doc/refman/5.6/en/alter-table.html) 3. Fast Index Creation(FIC) Innodb 存储引擎从 1.0.x 版本开始,对添加索引操纵引入了新特征 Fast Index Creation(FIC 特征)。FIC 就是添加或删除二级索引的时辰,可以不消复制原表,而是在建设或删除二级索引时会对原表加上一个 S 锁(共享锁),应承其他会话举办读操纵,但榨取写操纵,按照当前表数据建设索引,新索引建设完成之后,扫除 S 锁,应承写操纵。 FIC 在建设索引时不必要拷贝整表数据,但只对二级索引有用,对主键索引无效,对付主键索引的建设和删除同样必要重建一个姑且表。 比拟 IN-Place 和 FIC,在网上查了一些资料,说“INPLACE 方法也称为 InnoDB fast index creation”,那两个应该不是一回事?我们看下官网的内容(MySQL 5.5): (引自:https://dev.mysql.com/doc/refman/5.5/en/innodb-create-index-overview.html) 在 MySQL 5.5 的官方声名中,并没有明晰声名 FIC 就是 INPLACE,而且此版本中的 FIC 只支持二级索引和帮助索引的增进和删除。而在 MySQL 5.6 官方声名中,则指出 Online DDL 特征基于 InnoDB FIC 构建。 (引自:https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl.html) 在 MySQL 8.0 的官方声名中,则指出了 FIC 是 Online DDL 的延长和扩展。 (引自:https://dev.mysql.com/doc/refman/8.0/en/glossary.html) 以是,综上所述,“INPLACE 方法也称为 InnoDB fast index creation”这句话是对的,Online DDL 方法延长了 Fast Index Creation,并逐渐扩展了 FIC 的范畴。 Since MySQL 5.6 在 MySQL 5.6 版本,引入了 Online DDL,这个新特征办理了早期版本 MySQL 举办 DDL 操纵时带来的锁表题目,Online DDL 执行的进程中依然担保可以读写,不影响数据库对外提供处事。 Online DDL
ALGORITHM 子句指定执行 DDL 回收的方法,LOCK 子句描写持有锁范例来节制 DML 的并发。个中,某些 DDL 语句不支持 Online DDL 的回收 COPY 方法,支持的就回收 INPLACE 方法,由于 Online DDL 是对早期 INPLACE 方法的加强,以是 INPLACE 方法按照是否涉及记录名目标修改又分为:Rebuilds Table 和 No-Rebuilds Table,我们看下官方给出的内容(MySQL 5.7): (引自:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html) (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |