mysql online ddl的演化
背景
最早採用copy-delete方式建立二級索引,5.1引入in-place/fast index creation節約臨時檔案開銷(仍舊阻塞寫),5.6引入online(藉助日誌表);
Online不僅限於建立/刪除二級索引,還包含重新命名/新增/刪除列,更改row_format/key_block_size/default;
建立聚簇索引:仍然採用copy+delete模式,臨時檔案存於tmpdir;
每個online DDL的開頭和結束都會短暫佔用X lock,可透過lock=none/shared/exclusive指定DDL的併發程度,algorithm=inplace/copy控制建立方法;
引數
innodb_online_alter_log_max_size:online DDL會將期間的DML存於臨時檔案,以innodb_sort_buffer_size為單位擴充套件;
innodb_sort_buffer_size:建立索引時指定sort buffer,只用於merge sort,分配3個buffer;
https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_sort_buffer_size
fast index creation
採用inplace替代 table-copying,索引記錄插入前進行merge-sort,有助於提高fill factor;
可設定old_alter_table=0選用舊的table-copying
online index creation
5.6重寫了alter table介面,可透過algorithm=copy選擇 table-copying演算法;
在prepare和commit階段會申請X lock,若commit等待鎖超時則會回滾alter table操作,大致步驟如下:
1 Set up a stub for the index, for logging changes.
2 Scan the table for index records.
3 Sort the index records.
4 Bulk load the index records.
5 Apply the logged changes.
6 Replace the stub with the actual index.
alter table會跳過所有標誌為deleted的行並將其刪除;
https://blogs.oracle.com/mysqlinnodb/entry/online_alter_table_in_mysql
修改表列
官方解釋:Although ALGORITHM=INPLACE is allowed, the data is reorganized substantially, so it is still an expensive operation.
而add/drop/reorder column仍需table copy, However, the table copy for these operations is faster than it was in MySQL 5.5 and prior.
add column比modify column會快,不修改現有資料(default value存於frm而非資料字典);
案例http://www.itpub.net/thread-1876844-1-1.html
Inplace即便採用table copy,也比old copy快很多
add/drop column的情況下,如果是inplace演算法, 資料檔案在執行過程中是這樣的
root@debian:/mysqldata/test# ls -l
total 639220
-rw-rw---- 1 mysql mysql 15118 Jul 9 13:31 #sql-d19_1.frm
-rw-rw---- 1 mysql mysql 212992 Jul 9 13:31 #sql-ib53.ibd
-rw-rw---- 1 mysql mysql 15154 Jul 9 13:15 task.frm
-rw-rw---- 1 mysql mysql 654311424 Jul 9 13:24 task.ibd
如果是copy演算法,資料檔案是這樣的
root@debian:/mysqldata/test# ls -l
total 1105960
-rw-rw---- 1 mysql mysql 15154 Jul 9 13:15 #sql-d19_1.frm
-rw-rw---- 1 mysql mysql 603979776 Jul 9 13:23 #sql-d19_1.ibd
-rw-rw---- 1 mysql mysql 15118 Jul 8 17:50 task.frm
-rw-rw---- 1 mysql mysql 528482304 Jul 8 17:51 task.ibd
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-1307441/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL Online DDL 概述MySql
- Limitations of Online DDL for MySQLMITMySql
- MySQL 5.7 Online DDL OverviewMySqlView
- MySQL DDL執行方式-Online DDL介紹MySql
- MySQL 5.6 Online DDL.mdMySql
- mysql之 openark-kit online ddlMySql
- MySQL 5.7 online DDL特性介紹MySql
- 【MySQL】online ddl 思維導圖MySql
- mysql5.6的online ddl功能測試MySql
- MySQL online ddl 工具之pt-online-schema-changeMySql
- MySQL Online DDL--pt-online-change-schema測試MySql
- 【MySQL】online ddl 工具之pt-online-schema-changeMySql
- MySQL & MariaDB Online DDL 參考指南MySql
- MySQL Online DDL的實現細節介紹MySql
- MySQL ONLINE DDL 和PT-ONLINE-SCHEMA-CHANGE對比MySql
- MySQL5.6支援哪些Online DDL操作MySql
- MySQL5.6 Online DDL線上狀態總結MySql
- MySQL Online DDL導致全域性鎖表案例分析MySql
- 一個 MySQL 線上 DDL 工具 — pt-online-schema-changeMySql
- MySQL 執行 Online DDL 操作報錯空間不足?MySql
- MySQL 5.6版本哪些操作可以進行online DDLMySql
- MySQL Online DDL(二)(r11筆記第88天)MySql筆記
- MySQL在其版本迭代後Online DDL功能發生了哪些變化?MySql
- MySQL 8.0 Reference Manual(讀書筆記81節-- InnoDB and Online DDL (1))MySql筆記
- MySQL 8.0 Reference Manual(讀書筆記82節-- InnoDB and Online DDL (2))MySql筆記
- MySQL 8.0 Reference Manual(讀書筆記83節-- InnoDB and Online DDL (3))MySql筆記
- MySQL 8.0 Reference Manual(讀書筆記84節-- InnoDB and Online DDL (4))MySql筆記
- mysql semi-sync的演化MySql
- 記錄一次 Online DDL 操作
- mysql多執行緒slave的演化MySql執行緒
- mysql 原生 線上DDL 的bug .MySql
- 對比上次MySQL的DDLMySql
- 【實驗】【MySQL】MySQL的DDL語言演示MySql
- mysql DDL時鎖表的排查MySql
- 04 MySQL 表的基本操作-DDLMySql
- TiDB Online DDL 在 TiCDC 中的應用丨TiDB 工具分享TiDB
- MySQL 線上DDL "gh-ost"MySql
- 【Mysql】MySQL 5.6中如何定位DDL被阻塞的問題MySql