MySQL-5.7 innodb在线DDL操作性能和并发

如果不了解innodb在线DDL,可以参考上一篇MySQL-5.7 innodb在线DDL操作(增删改索引、列、外键、表、外键)

在线 DDL 改进了一些 MySQL 操作:

  • 访问该表的应用程序响应更快,因为在进行 DDL 操作时可以继续对表进行查询和 DML 操作。减少锁定和等待 MySQL 服务器资源导致更大的可伸缩性,即使对于 DDL 操作中不涉及的操作也是如此。
  • In-place操作避免了与表复制方法相关的磁盘 I/O 和 CPU 周期,从而最大限度地减少了数据库的总体负载。最小化负载有助于在 DDL 操作期间保持良好的性能和高吞吐量。
  • 与表复制操作相比,In-place操作将更少的数据读入缓冲池,从而减少了从内存中清除频繁访问的数据。清除频繁访问的数据可能会导致 DDL 操作后出现暂时的性能下降。

LOCK

默认情况下,MySQL 在 DDL 操作期间尽可能少使用锁。如果LOCK cause指定的锁定级别低于特定 DDL 操作所允许的级别,则该语句将失败并出现错误。

LOCK=NONE

允许并发查询和 DML。

LOCK=SHARED

允许并发查询但阻止 DML。

LOCK=DEFAULT

允许尽可能多的并发(并发查询、DML 或两者)。省略LOCK cause与指定相同LOCK=DEFAULT。

LOCK=EXCLUSIVE

阻止并发查询和 DML。

如果不需要并发查询和 DML 访问,期待尽可能短的时间内完成 DDL 操作,可以使用 LOCK=EXCLUSIVE。

在线DDL和Metadata 锁

在线 DDL 操作有三个阶段:

  • 第一阶段:初始化
    在初始化阶段,根据存储引擎能力、SQL操作以及用户指定的 ALGORITHM和LOCK 选项,服务器确定在操作期间允许多少并发。在此阶段,采用共享的可升级Metadata锁来保护当前表definition。

  • 第二阶段:执行
    在此阶段,准备和执行语句。根据初始化阶段评估的因素决定Metadata锁是否升级为独占锁。如果需要独占Metadata锁,则只会在语句准备期间短暂使用。

  • 第三阶段:提交表definition
    在此阶段,把旧表 definition 升级为新definition 需要Metadata锁升级为独占锁。一旦获取到锁,独占Metadata锁的持续时间很短。

在线 DDL 性能

DDL操作的性能很大程度上取决于操作是否in-place执行以及是否重建表。

对于修改表数据的 DDL 操作,您可以通过查看命令完成后显示的“受影响的行数”值 来确定 DDL 操作是in-place执行更改还是执行表copy。例如:

更改列的默认值(快速,不影响表数据):

Query OK, 0 rows affected (0.07 sec)

添加索引(耗时,但0 rows affected显示表未复制):

Query OK, 0 rows affected (21.42 sec)

更改列的数据类型(需要大量时间并且需要重建表的所有行):

Query OK, 1671168 rows affected (1 min 35.54 sec)

在对大表运行 DDL 操作之前,检查操作是快还是慢,如下所示:

  1. 复制一样的表结构。
  2. 用少量数据填充复制表。
  3. 在复制表上运行 DDL 操作。
  4. 检查“受影响的行”值是否为零。非零值表示操作copy表数据,这可能需要特殊规划。

你可能感兴趣的:(MySQL技术,mysql,innodb,ddl)