亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL 大表添加一列的實現(xiàn)

 更新時間:2021年02月06日 11:05:13   作者:干貨滿滿張哈希  
這篇文章主要介紹了MySQL 大表添加一列的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

問題參考自: https://www.zhihu.com/question/440231149 ,mysql中,一張表里有3億數(shù)據(jù),未分表,要求是在這個大表里添加一列數(shù)據(jù)。數(shù)據(jù)庫不能停,并且還有增刪改操作。請問如何操作?答案為個人原創(chuàng)

以前老版本 MySQL 添加一列的方式:

ALTER TABLE 你的表 ADD COLUMN 新列 char(128);

會造成鎖表,簡易過程如下:

  • 新建一個和 Table1 完全同構(gòu)的 Table2
  • 對表 Table1 加寫鎖
  • 在表 Table2 上執(zhí)行 ALTER TABLE 你的表 ADD COLUMN 新列 char(128)
  • 將 Table1 中的數(shù)據(jù)拷貝到 Table2
  • 將 Table2 重命名為 Table1 并移除 Table1,釋放所有相關(guān)的鎖

如果數(shù)據(jù)量特別特別大,那么鎖表時間很長,期間所有表更新都會阻塞,線上業(yè)務(wù)不能正常執(zhí)行。

針對 MySQL 5.6(不包含)之前的版本,通過觸發(fā)器將一個表的更新在另一個表上重復(fù),并進(jìn)行數(shù)據(jù)同步,當(dāng)數(shù)據(jù)同步完成時,業(yè)務(wù)上修改表名為新表并發(fā)布。業(yè)務(wù)不會暫停。觸發(fā)器設(shè)置類似于:

create trigger person_trigger_update AFTER UPDATE on 原有表 for each row 
begin set @x = "trigger UPDATE";
Replace into 新表 SELECT * from 原有表 where 新表.id = 原有表.id;
END IF;
end;

MySQL 5.6(包含) 以后的版本引入了在線 DDL 的功能:

Alter table 你的表 , ALGORITHM [=] {DEFAULT|INSTANT|INPLACE|COPY}, LOCK [=] { DEFAULT| NONE| SHARED| EXCLUSIVE }

其中的參數(shù):

ALGORITHM:

  • DEFAULT:默認(rèn)方式,在 MySQL 8.0中,如果未顯示指定 ALGORITHM,那么會優(yōu)先選擇 INSTANT 算法,如果不行再使用 INPLACE 算法,如果不支持 INPLACE 算法則使用 COPY 的方式完成
  • INSTANT:8.0 中新添加的算法,添加列是立即返回。但是不能是虛擬列。這個原理很簡單,對于新建一列,表所有原有數(shù)據(jù)并不是立刻發(fā)生變化,只是在表字典里面記錄下這個列和默認(rèn)值,對于默認(rèn)的 Dynamic 行格式(其實就是 Compressed 的變種),如果更新了這一列則原有數(shù)據(jù)標(biāo)記為刪除在末尾追加更新后的記錄。這樣做就是沒有提前預(yù)留出列空間,之后更新可能經(jīng)常會發(fā)生行記錄空間變動。但是對于大多數(shù)業(yè)務(wù),都是最近的時間的記錄才會修改,所以問題不大。
  • INPLACE:在原表上直接進(jìn)行修改,不會拷貝臨時表,可以逐條記錄修改,不會產(chǎn)生大量的 undolog 以及 redolog,不會占用很多 buffer??梢员苊庵亟ū韼淼腎O和CPU消耗,保證期間依然良好的性能和并發(fā)。
  • COPY:拷貝到臨時新表上進(jìn)行修改。由于記錄拷貝,會產(chǎn)生大量的 undolog 以及 redolog,并占用很多 buffer,對業(yè)務(wù)性能有影響。

LOCK:

  •  DEFAULT:和 ALGORITHM 的 DEFAULT 類似
  • NONE:無鎖,允許并發(fā)讀取和更新表
  • SHARED:共享鎖,允許讀取不允許更新
  • EXCLUSIVE:不允許讀取和更新

各個版本支持的在線 DDL 修改使用的算法的對比:

image

參考文檔:

MySQL 5.6:https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.htmlMySQL

5.7:https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.htmlMySQL

8.0:https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html

可以通過:

ALTER TABLE 你的表 ADD COLUMN 新列 char(128), ALGORITHM=INSTANT, LOCK=NONE;

類似的語句,實現(xiàn)在線增加字段。最好還是明確 ALGORITHM 以及 LOCK,這樣執(zhí)行 DDL 的時候能明確知道到底會對線上業(yè)務(wù)有多大影響

同時,執(zhí)行在線 DDL 的過程大概是:

image

可以看出,在開始階段需要 metadata lock,metadata lock 是在 5.5 才引入到mysql,之前也有類似保護(hù)元數(shù)據(jù)的機制,只是沒有明確提出 metadata lock 概念而已。但是 5.5 之前版本(比如5.1)與5.5之后版本在保護(hù)元數(shù)據(jù)這塊有一個顯著的不同點是,5.1對于元數(shù)據(jù)的保護(hù)是語句級別的,5.5對于metadata的保護(hù)是事務(wù)級別的。所謂語句級別,即語句執(zhí)行完成后,無論事務(wù)是否提交或回滾,其表結(jié)構(gòu)可以被其他會話更新;而事務(wù)級別則是在事務(wù)結(jié)束后才釋放 metadata lock。

引入 metadata lock 后,主要解決了2個問題,一個是事務(wù)隔離問題,比如在可重復(fù)隔離級別下,會話A在2次查詢期間,會話B對表結(jié)構(gòu)做了修改,兩次查詢結(jié)果就會不一致,無法滿足可重復(fù)讀的要求;另外一個是數(shù)據(jù)復(fù)制的問題,比如會話A執(zhí)行了多條更新語句期間,另外一個會話B做了表結(jié)構(gòu)變更并且先提交,就會導(dǎo)致 slave 在重做時,先重做 alter,再重做 update 時就會出現(xiàn)復(fù)制錯誤的現(xiàn)象。

如果當(dāng)前有很多事務(wù)在執(zhí)行,并且有那種包含大查詢的事務(wù),例如:

START TRANSACTION;
select count(*) from 你的表

這樣類似的會執(zhí)行較長時間的事務(wù),也會阻塞。

所以,原則上:

  • 避免大事務(wù)
  • 在業(yè)務(wù)低峰去做表結(jié)構(gòu)變化

到此這篇關(guān)于MySQL 大表添加一列的實現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL 大表添加一列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決mysql:ERROR 1045 (28000): Access denied for user ''root''@''localhost'' (using password: NO/YES)

    解決mysql:ERROR 1045 (28000): Access denied for user ''root''@

    今天給大家分享一篇教程幫助大家解決mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)的問題,非常不錯,特此分享到腳本之家平臺供大家學(xué)習(xí)
    2021-06-06
  • SQL慢查詢優(yōu)化方案詳解

    SQL慢查詢優(yōu)化方案詳解

    這篇文章主要介紹了SQL慢查詢優(yōu)化方案詳解,如果你的項目中出現(xiàn)了一些查詢超時情況,很可能是項目中有了一些慢查詢的情況產(chǎn)生,下面就慢查詢的排查和解決方案進(jìn)行一番分析,需要的朋友可以參考下
    2023-07-07
  • MySQL的一些常用的SQL語句整理

    MySQL的一些常用的SQL語句整理

    這篇文章主要介紹了MySQL的一些常用的SQL語句整理,非常基礎(chǔ),適合隨看隨記:)需要的朋友可以參考下
    2015-07-07
  • MySQL Administrator 登錄報錯的解決方法

    MySQL Administrator 登錄報錯的解決方法

    使用MySQL Administrator 登錄,報錯: Either the server service or the configuration file could not be found.Startup variable and service section are there for disabled.
    2010-12-12
  • MySQL必備的常見知識點匯總整理

    MySQL必備的常見知識點匯總整理

    這篇文章主要介紹了MySQL必備的常見知識點,結(jié)合實例形式匯總整理了mysql各種常見知識點,包括登錄、退出、創(chuàng)建、增刪改查、事務(wù)等知識點與操作注意事項,需要的朋友可以參考下
    2020-05-05
  • mysql 8.0.12 winx64解壓版安裝圖文教程

    mysql 8.0.12 winx64解壓版安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.12 winx64解壓版安裝圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • 深入Mysql字符集設(shè)置[精華結(jié)合]

    深入Mysql字符集設(shè)置[精華結(jié)合]

    深入Mysql字符集設(shè)置,建議大家看本文之前先看風(fēng)雪之隅的文章,需要的朋友可以參考下
    2012-07-07
  • mysql 帶多個條件的查詢方式

    mysql 帶多個條件的查詢方式

    這篇文章主要介紹了mysql 帶多個條件的查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MySQL對JSON類型字段數(shù)據(jù)進(jìn)行提取和查詢的實現(xiàn)

    MySQL對JSON類型字段數(shù)據(jù)進(jìn)行提取和查詢的實現(xiàn)

    本文主要介紹了MySQL對JSON類型字段數(shù)據(jù)進(jìn)行提取和查詢的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 一文帶你搞懂MySQL的事務(wù)隔離級別

    一文帶你搞懂MySQL的事務(wù)隔離級別

    這篇文章主要給大家介紹了MySQL事務(wù)隔離級別,事務(wù)隔離級別分別是讀未提交,讀已提交,可重復(fù)讀,串行化,文中有詳細(xì)的圖文介紹,需要的朋友可以參考下
    2023-07-07

最新評論