mysql onlibe all_MySQL Online DDL
雖然FIC可以讓InnoDB存儲引擎免創(chuàng)建臨時表,從而提高索引創(chuàng)建的效率。但正如前面所說,索引創(chuàng)建時會阻塞表上的DML操作。OSC雖然解決了上述的部分問題,但是還是有很大的局限性。MySQL5.6版本可以支持Online DDL(在線數(shù)據(jù)定義)操作,其允許輔助索引創(chuàng)建的同時,還允許其他諸如INSERT UPDATE DELETE這類的DML操作。這幾大提高了MySQL數(shù)據(jù)庫在生產(chǎn)環(huán)境中的可用性
此外,不僅是輔助索引,以及這幾類的DDL操作都可以通過在線的方式進(jìn)行操作
輔助索引的創(chuàng)建與刪除
改變自增長值
添加或刪除外鍵約束
列的重命名
通過新的ALTER TABLE語法,用戶可以選擇索引的創(chuàng)建方式:
ALGORITHM指定了創(chuàng)建或刪除索引的算法,COPY表示按照MySQL5.1版本之前的工作模式,即創(chuàng)建臨時表的方式.INPLACE表示索引創(chuàng)建或刪除操作不需要創(chuàng)建臨時表。DEFAULT表示根據(jù)參數(shù)old_alter_table來判斷是通過INPLACE還是COPY的算法,該參數(shù)的默認(rèn)值為OFF,表示采用INPLACE的方式
LOCK部分為索引創(chuàng)建或刪除時對表添加鎖的情況 可有的選擇為:
a)NONE
執(zhí)行索引創(chuàng)建或刪除操作時,對目標(biāo)表不添加任何的鎖,即事務(wù)依然可以進(jìn)行讀寫操作,不會有收到阻塞。因此這種模式可以獲得更大的并發(fā)度
b)SHARE
這和之前的FIC類似,執(zhí)行索引創(chuàng)建或刪除操作時,對目標(biāo)表加上一個S鎖。對于并發(fā)的讀事務(wù),依然可以執(zhí)行,但是遇到寫事務(wù),就會發(fā)生等待操作,如果存儲引擎不支持SHARE模式,會返回一個錯誤信息
c)EXCLUSIVE
在這個模式下,執(zhí)行索引創(chuàng)建或刪除操作時,對目標(biāo)表加上一個X鎖。讀寫事務(wù)都不能進(jìn)行。因此會阻塞所有的線程。這和COPY方式運行得到的狀態(tài)類似。但不需要像COPY那樣創(chuàng)建一張臨時表
d)DEFAULT
首先會判斷當(dāng)前的操作是否使用了NONE模式,若不能則判斷是否使用SHARE模式,最后判斷是否使用了EXCLUSIVE模式也就是說DEFAULT會通過判斷事務(wù)的最大并發(fā)性來判斷執(zhí)行DDL模式
InnoDB存儲引擎實現(xiàn)Online DDL的原理是在執(zhí)行創(chuàng)建或刪除操作的同時,將INSERT/UPDATE/DELETE這類的DML操作日志寫入到一個緩存中。待完成索引創(chuàng)建后再重做應(yīng)用到表上。以此達(dá)到數(shù)據(jù)的一致性。這個緩存大小由innodb_online_alter_log_max_size控制,默認(rèn)128MB。若用戶更新的表比較大,在創(chuàng)建過程中伴有大量的寫事務(wù),如遇到innodb_online_alter_log_max_size的空間不能存放日志是,會拋出
對于這個操作,可以跳大參數(shù)innodb_online_alter_log_max_size,一次獲得更大的日志緩存空間。此外,還可以設(shè)置ALTER TABLE的模式為SHARE。這樣在執(zhí)行過程中就不會有寫事務(wù)發(fā)生。因此不需要進(jìn)行DML日志的記錄
需要特別注意,由于Online DDL在創(chuàng)建索引完成后在通過重做日志達(dá)到數(shù)據(jù)庫的最終一致性。這意味著在索引創(chuàng)建過程中,SQL優(yōu)化器不會選擇正在創(chuàng)建中的索引
總結(jié)
以上是生活随笔為你收集整理的mysql onlibe all_MySQL Online DDL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这条裙子到底是白金,还是蓝黑?微博已吵疯
- 下一篇: mysql www.school.com