最佳化DDL操作過程中的Buffer Pool管理機制,降低DDL操作帶來的效能影響,提升線上DDL操作的並發數。
前提條件
執行個體版本如下:
背景資訊
資料庫經常會執行DDL操作,也經常會遇到DDL相關的問題,例如:
為什麼加索引會造成執行個體的抖動,影響正常的業務讀寫?
為什麼不到1 GB的表執行DDL有時需要十幾分鐘?
為什麼使用了暫存資料表的串連退出時會造成執行個體抖動?
針對這些常見問題,RDS核心團隊進行分析後發現MySQL在DDL操作期間的緩衝維護邏輯存在效能缺陷,通過深入分析及多次測試,開發Faster DDL功能,最佳化了Buffer Pool頁面管理原則,大幅減少DDL操作導致的鎖爭用,有效解決或緩解上述問題,讓您的執行個體在正常業務壓力下可以安心執行DDL操作。
開啟Faster DDL
您可以在控制台修改參數loose_innodb_rds_faster_ddl為ON,開啟Faster DDL。詳情請參見設定執行個體參數。
DDL情境測試
測試情境
選取RDS MySQL 8.0支援的兩種In Place Online DDL操作進行驗證, 其中CREATE INDEX操作不需要重建表,OPTIMIZE TABLE操作需要重建表。
操作
Instant
In Place
重建表
允許並發DML
只修改中繼資料
CREATE INDEX
否
是
否
是
否
OPTIMIZE TABLE
否
是
是
是
否
測試執行個體
MySQL 8.0執行個體(8核、64 GB),執行DDL操作的表大小為600 MB。
測試過程
使用Sysbench類比線上業務進行壓力測試,在壓測期間執行DDL操作,進行反覆對比測試。
測試結果
操作
平均執行時間(關閉最佳化)
平均執行時間(開啟最佳化)
效能提升倍數
Create Index
56秒
4.9秒
11.4
Optimize Table
220秒
17秒
12.9
測試小結
在DDL情境下,最佳化後的AliSQL核心MySQL相比社區版本MySQL,DDL操作執行時間縮短了90%以上。
暫存資料表情境測試
MySQL在很多情況下會使用暫存資料表,例如查詢information_schema庫裡的表、 加速複雜SQL執行時自動建立暫存資料表。線上程退出時系統會集中清理用過的暫存資料表,這也屬於一種特殊類型的DDL操作,同樣會導致執行個體的效能抖動。 詳情請參見Temp ibt tablespace truncation at disconnection stuck InnoDB under large BP。
測試執行個體
MySQL 8.0執行個體(8核、64 GB)。
測試過程
使用tpcc-mysql進行壓力測試,將Buff Pool基本用滿,然後發起單線程短串連的暫存資料表請求。
測試結果
對比項
正常情況(無DDL操作)
開啟最佳化
關閉最佳化
每秒事務數(TPS)
42,000
40,000
<10,000
壓測過程中的秒級效能資料如下所示(紅線處為關閉DDL加速功能):
其中 IUD(Insert/Update/Delete)列和 Cmit(Commit)列的數值變化最為顯著,反映了關閉 DDL 加速功能前後的 TPS 差異。
05/28 17:49:53 0.01 1/6 0/0 1/6 8.36 70GB 7094 219 260 87 107 2 40.7% 0 5.6MB 2MB 4.6MB 0B 05/28 17:49:54 0.01 2/6 0/0 2/2 8.43 70GB 6828 219 259 86 130 4 40.4% 0 5.6MB 2MB 4.6MB 0B 05/28 17:49:55 0.04 1/7 0/0 1/6 8.36 70GB 7629 219 259 91 117 2 42.3% 0 6.2MB 2.1MB 4.8MB 0B 05/28 17:49:56 0.04 2/4 0/0 2/4 8.12 70GB 6616 219 259 95 119 2 38.4% 0 5.2MB 1.9MB 3.8MB 0B 05/28 17:49:57 0.04 1/5 0/0 1/5 8.43 70GB 7094 219 259 119 0 41K 0 5.1MB 1.8MB 3.6MB 0B 05/28 17:49:58 0.04 1/6 0/0 1/6 8.43 70GB 7155 219 259 95 124 0 41K 0 5.1MB 1.8MB 3.5MB 0B 05/28 17:49:59 0.04 1/7 0/0 1/5 8.43 70GB 7011 219 259 84 115 2 40.5% 0 5.1MB 1.8MB 3.5MB 0B 05/28 17:50:00 0.17 1/6 0/0 1/4 8.4 70GB 7051 219 259 84 120 2 40.8% 0 5.6MB 2MB 4.5MB 0B 05/28 17:50:01 ---OS--- -----------Process----------- ---MySQL--- Load SY/US/WI/IR SY/US CpuR Mem IOPS THD Conn Cre Run Sel IUD Cmit LongQ ByteI ByteO Blog Dump Aply 05/28 17:50:01 0.17 1/6 0/0 1/5 6.46 70GB 6874 219 259 81 125 0 39.8k 0 4.4MB 1.9MB 4.5MB 0B 05/28 17:50:02 0.17 2/6 0/0 2/6 8.26 70GB 7205 261 91 259 125 0 40.0k 0 5.6MB 2MB 4.5MB 0B 05/28 17:50:03 0.17 1/5 0/0 1/5 6.46 70GB 7117 219 259 87 125 0 41.3% 0 5.6MB 2MB 4.5MB 0B 05/28 17:50:04 0.17 1/6 0/0 1/6 6.46 70GB 7088 219 259 99 120 0 41.6% 0 5.7MB 2MB 4.6MB 0B 05/28 17:50:05 0.17 1/6 0/0 1/6 8.43 70GB 7088 219 259 98 118 0 39.9% 0 5.5MB 2MB 4.5MB 0B 05/28 17:50:06 0.17 1/7 0/0 1/7 8.31 70GB 3638 225 289 35 129 2 21.4k 0 3.5MB 1.1MB 2.4MB 0B 05/28 17:50:07 0.14 1/4 0/0 1/4 8.43 70GB 1388 249 302 13 132 0 8325 0 1.1MB 425KB 950KB 0B 05/28 17:50:08 0.14 1/8 0/0 1/8 8.24 70GB 1202 296 399 3 130 0 7232 0 1.5MB 385KB 817KB 0B 05/28 17:50:09 0.14 3/4 0/0 3/4 8.46 70GB 785 287 314 7 151 2 4524 0 636KB 276KB 536KB 0B 05/28 17:50:10 0.14 1/4 0/0 1/4 8.43 70GB 1087 294 9 122 3 6809 0 959KB 348KB 416KB 0B 05/28 17:50:11 0.14 2/4 0/0 2/4 8.43 70GB 305 229 3 147 0 3456 0 416KB 256KB 416KB 0B 05/28 17:50:12 0.14 1/4 0/0 1/4 8.24 70GB 305 287 7 139 3 3259 0 461KB 256KB 416KB 0B 05/28 17:50:13 0.14 0/4 0/0 0/4 8.26 70GB 361 302 3 76 0 1512 0 197KB 81KB 166KB 0B 05/28 17:50:14 0.14 0/7 0/0 0/6 8.26 70GB 1815 305 3 86 0 15.7% 0 2.1MB 796KB 1.7MB 0B 05/28 17:50:15 0.14 0/6 0/0 0/5 8.26 70GB 2009 305 9 86 2 16.2% 0 2.2MB 891KB 1.3MB 0B 05/28 17:50:16 0.14 1/4 0/0 1/4 8.26 70GB 351 354 4 194 0 2925 78 352KB 127KB 306KB 0B 05/28 17:50:17 0.14 0/3 0/0 0/3 8.43 70GB 657 354 4 232 2 2506 0 352KB 127KB 306KB 0B 05/28 17:50:18 0.14 1/4 0/0 1/4 8.24 70GB 345 358 4 232 1 192 0 25KB 132KB 2KB 15KB 0B 05/28 17:50:19 0.14 1/3 0/0 1/3 8.4 70GB 346 354 4 119 0 - 0 25KB 132KB 2KB 15KB 0B 05/28 17:50:20 0.14 0/7 0/0 0/7 8.4 70GB 346 354 4 176 0 7897 239 1MB 807KB 15KB 0B測試小結
原生MySQL在每次暫存資料表線程退出時出現劇烈的效能抖動,TPS下降超過70%,開啟最佳化之後效能影響降低至5%。
最佳化效果
Faster DDL加速功能支援RDS MySQL 5.6、5.7、8.0三個版本,但是不同版本支援加速的DDL類型不同,詳情請參見下表。
分類 | DDL操作 | MySQL 5.6 | MySQL 5.7 | MySQL 8.0 |
In Place DDL | 詳情請參見MySQL 8.0 Online DDL Operations和MySQL 5.7 Online DDL Operations。 | 否 | 是 | 是 |
資料表空間管理 | 開關資料表空間加密。 | 否 | 是 | 是 |
釋放或刪除資料表空間。 | 否 | 是 | 是 | |
丟棄資料表空間。 | 是 | 是 | 是 | |
刪除表 | 釋放或刪除表。 | 是 | 是 | 是 |
Undo操作 | 釋放或刪除undo資料表空間。 | 否 | 否 | 是 |
重新整理表 | 重新整理表及髒頁。 | 是 | 是 | 是 |
Faster DDL解決的缺陷
Faster DDL完美解決了以下MySQL臨時缺陷: