mysql alter table add column的几个性能知识点

今天调查了一个问题,背景是在aws的 Aurora MySQL上,三百万数据的表里追加列,测试了中间指定位置追加,和默认的末尾追加,发现速度都挺快的。

一般印象里在中间追加应该比默认的情况要慢一些,结果是反而稍微快一点。就想要深入得了解一下。以下为内容。

问题:在追加列时,①default追加到末尾与②指定位置追加两种 性能有什么区别。
语法:
①default默认无需指定位置,会追加到末尾

alter table table_name add column_name CHAR(10) ;

②指定位置,first指定列首,after指定在某一列之后,没有before关键词

alter table table_name ADD column_name CHAR(11) FIRST;
alter table table_name ADD column_name CHAR(11) AFTER column1;

MySQL,在表中添加一列时发生了什么(相同处理速度差不多)

根据指定的算法,该操作可涉及以下步骤:

  • 创建表的完整副本
  • 创建临时表,以处理并发数据操控语言 (DML) 操作
  • 重建此表的所有索引
  • 应用并发 DML 更改时应用表锁定
  • 减慢并发 DML 吞吐量

MySQL对两者的操作应该是相同的。消耗可见是很大的。

AWS  Aurora MySQL中启用fast DDL(不同处理)

查看是否开启了fast DDL,现在可以通过aurora_lab_mode的on off查看fast DDL有没有启用。

mysql> show variables like 'aurora_lab_mode';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| aurora_lab_mode | OFF   |
+-----------------+-------+
1 row in set (0.01 sec)

启用了FastDDL就可以很大程度缓解MySQL的痛点了。
“快速 DDL 立即就地执行 ALTER TABLE 操作。完成该操作无需复制表,对其他 DML 语句也没有重大影响。由于该操作不会在表复制中使用临时存储,因此,甚至可以对小型实例类中的大型表使用 DDL 语句。”(来源aws文档https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.FastDDL.html)

要注意的是,在上面的SQL例子中,FastDDL只应对了①default默认无需指定位置。所以开启了FastDDL的话,在比较大的数据表格中增加一列,①默认无指定位置的性能会远远优于②指定位置的性能。

上面的链接里具体写了FastDDL的限制(限制掉了②):

  • 快速 DDL 仅支持将没有默认值,可为空的列,且添加到现有表的最后
  • 快速 DDL 不支持分区表。
  • 快速 DDL 不支持使用 REDUNDANT 行格式的 InnoDB 表。
  • 如果 DDL 操作的最大可能的记录大小太大,则不会使用快速 DDL。如果大于页面大小的一半,则说明记录大小太大。记录的最大大小是将所有列的最大大小相加得出的。对于大小可变的列,按照 InnoDB 标准,不会在计算中包含外部字节。

SQLserver中添加一列发生什么(不同处理)

首先SQLsever中没有 指定任意位置增加一列的语法。如果想要实现这个功能,需要以下的操作:
1.数据暂存临时表2.做成带有新增列的表3.从临时表中取回数据

表:testTable

column0    column2new    column1
user1    men    tokyo
user2    women    saitama

// 创建临时表#test
SELECT * INTO #test
 //删掉旧表
DROP TABLE testTable
 // 创建新表
CREATE TABLE testTable
(
 column0 int NOT NULL,
 column2new nvarchar2(5),
 column1 nvarchar2(20)
)
 // 从临时表中取回数据插入新表
INSERT INTO testTable
SELECT
 t.column0,
 0,
 t.column1
FROM #test t
 // 删掉临时表
DROP TABLE #test

SQLsever的语法(普通默认模式):

ALTER TABLE testTable ADD column2new;

就不涉及上面复杂的操作,默认加到末尾。

alter table, Aurora MySQL和mysql性能对比

不错的一篇文章:http://blog.symedia.pl/2017/06/ddl-performance-on-mysql-aurora.html

 

以上。

你可能感兴趣的:(mysql,aws)