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

 

以上。

發佈了34 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章