mysql online ddl的演化

myownstars發表於2014-10-22

背景
最早採用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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章