innodb存儲引擎實作online ddl的原理是在執行建立或删除操作的同時,将DML記錄檔寫入到一個緩存中,待完成索引建立後再重做應用到表上,以此達到資料的一緻性,這個緩存大小由參數innodb_online_alter_log_max_size控制,預設是128M,若使用者更新的表比較大,并且在建立過程中 伴有大量的寫事務,可能碰到這個參數空間不夠用的情況。
以下幾類DDL操作都可以通過線上的方式操作:
A:輔助索引的建立與删除
B:改變自增長值
C:添加或删除外鍵
D:列的重命名
E:添加和删除列,但是會copy table
F:改變row_format,改變key_block_size, 但是會copy table
G:添加删除列的not null default xx,default null屬性, 但是會copy table
H:添加主鍵,雖然可以線上修改,但是會導緻重新組織表,會copy table,代價非常大
I:修改表持久化統計資訊選項
J:修改引擎,但是會copy table
以下幾類DDL操作不能通過線上方式操作(online ddl時會阻塞DML操作):
A:修改資料列類型定義,會copy table
B:修改表或列字元集轉換, 會copy table
C:删除主鍵, 會copy table
D:添加全文索引,不會copy table
需要特别注意的是,由于online ddl在建立索引完成後再通過重做DML記錄檔來達到資料的一緻性,這意味着在索引建立或删除的過程中,SQL優化器不會選擇正在建立中或删除中的索引。
參考資訊:http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html
作者:小蘿蔔
微信公衆号:開源城邦
出處:小蘿蔔的部落格 http://www.cnblogs.com/xiaoboluo768/
感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。
最新拙作:《千金良方——MySQL性能優化金字塔法則》,京東有售,圖書提供附錄提供電子版免費下載下傳,詳見連結:http://www.broadview.com.cn/book/5458
關于此書的代碼段、部分高清大圖和附錄已開源,詳見(覺得有用的話幫忙順手點個星星):https://github.com/xiaoboluo768/qianjinliangfang
關于此書基礎篇中關于4個系統字典庫全面講解文檔已開源,詳見(覺得有用的話幫忙順手點個星星):https://github.com/xiaoboluo768/mysql-system-schema