最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

會(huì)造成鎖表,簡(jiǎn)易過(guò)程如下:

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

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

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

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

LOCK:

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

各個(gè)版本支持的在線 DDL 修改使用的算法的對(duì)比:

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

可以通過(guò):

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

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

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

image

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

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

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

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

這樣類(lèi)似的會(huì)執(zhí)行較長(zhǎng)時(shí)間的事務(wù),也會(huì)阻塞。

所以,原則上:

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

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

相關(guān)文章

  • 如何利用Mysql計(jì)算地址經(jīng)緯度距離實(shí)時(shí)位置

    如何利用Mysql計(jì)算地址經(jīng)緯度距離實(shí)時(shí)位置

    最近工作中遇到了一個(gè)附近門(mén)店的功能,下面這篇文章主要給大家介紹了關(guān)于如何利用Mysql計(jì)算地址經(jīng)緯度距離實(shí)時(shí)位置的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • IDEA 鏈接Mysql數(shù)據(jù)庫(kù)并執(zhí)行查詢操作的完整代碼

    IDEA 鏈接Mysql數(shù)據(jù)庫(kù)并執(zhí)行查詢操作的完整代碼

    這篇文章主要介紹了IDEA 鏈接Mysql數(shù)據(jù)庫(kù)并執(zhí)行查詢操作的完整代碼,代碼不難,詳細(xì)大家看完本文肯定有意向不到的收獲,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • MySQL中Select查詢語(yǔ)句的高級(jí)用法分享

    MySQL中Select查詢語(yǔ)句的高級(jí)用法分享

    MySQL是一個(gè)開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),支持多種操作語(yǔ)言,其中最基礎(chǔ)、最常用的命令之一就是SELECT語(yǔ)句,所以本文就來(lái)和大家聊聊Select查詢語(yǔ)句的幾個(gè)高級(jí)用法吧
    2023-05-05
  • MySQL?InnoDB?Cluster搭建安裝教程

    MySQL?InnoDB?Cluster搭建安裝教程

    這篇文章主要介紹了MySQL?InnoDB?Cluster搭建安裝教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • mysql變量用法實(shí)例分析【系統(tǒng)變量、用戶變量】

    mysql變量用法實(shí)例分析【系統(tǒng)變量、用戶變量】

    這篇文章主要介紹了mysql變量用法,結(jié)合實(shí)例形式分析了mysql系統(tǒng)變量、用戶變量相關(guān)概念、功能、原理與使用技巧,需要的朋友可以參考下
    2020-04-04
  • MySQL insert 記錄后查詢亂碼問(wèn)題解決方法

    MySQL insert 記錄后查詢亂碼問(wèn)題解決方法

    文章通過(guò)分析一個(gè)MySQL插入數(shù)據(jù)后查詢亂碼的問(wèn)題,探討了亂碼的原因,并提出了解決方法,問(wèn)題的根本原因是MySQL客戶端和服務(wù)器之間的字符集不一致,導(dǎo)致插入的中文字符被錯(cuò)誤解碼為亂碼,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 你知道哪幾種MYSQL的連接查詢

    你知道哪幾種MYSQL的連接查詢

    連接(join)查詢是將兩個(gè)查詢的結(jié)果以“橫向?qū)印钡姆绞胶喜⑵饋?lái)的結(jié)果,這篇文章主要給大家介紹了關(guān)于MYSQL連接查詢的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 深入分析Mysql中l(wèi)imit的用法

    深入分析Mysql中l(wèi)imit的用法

    很久沒(méi)用mysql的limit,一時(shí)大意竟然用錯(cuò)了,自認(rèn)為(limit 開(kāi)始,結(jié)束),其實(shí)錯(cuò)了,正確的應(yīng)該是(limit 偏移量,條數(shù)),為了記住這次錯(cuò)誤,轉(zhuǎn)載一篇limit用法詳解。推薦給大家,希望對(duì)大家能夠有所幫助。
    2015-03-03
  • MySQL數(shù)據(jù)庫(kù)的性能優(yōu)化

    MySQL數(shù)據(jù)庫(kù)的性能優(yōu)化

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)的性能優(yōu)化,文中介紹的非常詳細(xì),一定的參考價(jià)值,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • MySQL復(fù)制之GTID復(fù)制的具體使用

    MySQL復(fù)制之GTID復(fù)制的具體使用

    從MySQL 5.6.5開(kāi)始新增了一種基于GTID的復(fù)制方式,本文主要介紹了MySQL復(fù)制之GTID復(fù)制的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

博客| 苍山县| 永顺县| 太仆寺旗| 九江县| 佛坪县| 阿克苏市| 泾源县| 乌恰县| 苏尼特左旗| 桐庐县| 罗定市| 高雄市| 陇南市| 平利县| 贡山| 宣化县| 潞西市| 龙陵县| 巴楚县| 黑水县| 衡阳县| 桐城市| 同仁县| 固始县| 吕梁市| 江安县| 阜宁县| 台东县| 襄城县| 平山县| 浏阳市| 舒兰市| 旺苍县| 红桥区| 宜城市| 满洲里市| 大宁县| 永善县| 沈丘县| 鸡泽县|