任何DDL操作,執(zhí)行者都需要預先測試或者清晰了解這個操作會給數(shù)據(jù)庫帶來的影響是否是在業(yè)務期間數(shù)據(jù)庫的可承受范圍內(nèi),尤其是對大表的DDL操作中,需要密切留意服務器的IO,內(nèi)存及CPU使用情況(每個DBA總有那么一段被大表的DDL語句坑到的血淚史)。
如果轉載,請注明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇家小蘿卜 所有。望各位支持!
1 早期DDL實現(xiàn)原理(5.6.7之前 )
Innodb早期支持通過copy table跟inplace的方式來執(zhí)行DDL語句,其原理如下:
copy table方式
新建跟原表格一致的臨時表,并在該臨時表上執(zhí)行DDL語句
鎖原表,不允許DML,允許查詢
逐行數(shù)據(jù)從原表拷貝到臨時表中(這個過程是沒有排序的)
拷貝結束后,原表禁止讀操作,也就是原表此時不提供讀寫服務
進行rename操作,完成DDL過程
inplace方式(fast index creation,僅針對索引的創(chuàng)建跟刪除)
新建frm臨時文件
鎖原表,不允許DML,允許查詢
按照聚集索引的順序,查詢數(shù)據(jù),找到需要的索引列數(shù)據(jù),排序后插入到新的索引頁中
原表禁止讀操作,也就是原表此時不提供讀寫服務
進行rename操作,替換frm文件,完成DDL過程
inplace在copy table的基礎上做了一個較大的改進,則是不需要copy整個表格,只需要在原來的ibd文件上,新建所需要的索引頁,這個過程比copy table節(jié)約極大的IO