今天调查了一个问题,背景是在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
以上。