今天調查了一個問題,背景是在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
以上。