任何DDL操作,執(zhí)行者都需要預先測試或者清晰了解這個操作會給數(shù)據(jù)庫帶來的影響是否是在業(yè)務期間數(shù)據(jù)庫的可承受范圍內(nèi),尤其是對大表的DDL操作中,需要密切留意服務器的IO,內(nèi)存及CPU使用情況(每個DBA總有那么一段被大表的DDL語句坑到的血淚史)。

 



 

    如果轉載,請注明博文來源: www.cnblogs.com/xinysu/   ,版權歸 博客園 蘇家小蘿卜 所有。望各位支持!

  



回到頂部(go to top)

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

網(wǎng)友評論