加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

浅谈DDL技能解密

发布时间:2019-09-28 16:38:45 所属栏目:编程 来源:张松然
导读:起首,用过数据库的小搭档们(本文以 MySQL InnoDB 为例)都知道,MySQL 不止有增编削数据操纵(DML),尚有改表布局的操纵(DDL),当新增进字段等修改表布局时,就必要举办 DDL 操纵。然则,假如对一个存储了上百万乃至上千上万的数据表举办 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 等机能的耗损,以及主从同步的耽误。

浅谈DDL技能解密

上述进程,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):

浅谈DDL技能解密

(引自:https://dev.mysql.com/doc/refman/5.5/en/alter-table.html)

以上是 MySQL 5.5 版本中的声名,而 MySQL 5.6 版本,则正式提出了 COPY 和 INPLACE 两种方法。

浅谈DDL技能解密

(引自: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 在建设索引时不必要拷贝整表数据,但只对二级索引有用,对主键索引无效,对付主键索引的建设和删除同样必要重建一个姑且表。

浅谈DDL技能解密

比拟 IN-Place 和 FIC,在网上查了一些资料,说“INPLACE 方法也称为 InnoDB fast index creation”,那两个应该不是一回事?我们看下官网的内容(MySQL 5.5):

浅谈DDL技能解密

(引自: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 构建。

浅谈DDL技能解密

(引自:https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl.html)

在 MySQL 8.0 的官方声名中,则指出了 FIC 是 Online DDL 的延长和扩展。

浅谈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

  1. Alter table …. , ALGORITHM [=] {DEFAULT|INPLACE|COPY}, LOCK [=] { DEFAULT| NONE| SHARED| EXCLUSIVE } 

ALGORITHM 子句指定执行 DDL 回收的方法,LOCK 子句描写持有锁范例来节制 DML 的并发。个中,某些 DDL 语句不支持 Online DDL 的回收 COPY 方法,支持的就回收 INPLACE 方法,由于 Online DDL 是对早期 INPLACE 方法的加强,以是 INPLACE 方法按照是否涉及记录名目标修改又分为:Rebuilds Table 和 No-Rebuilds Table,我们看下官方给出的内容(MySQL 5.7):

浅谈DDL技能解密

(引自:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html)

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读