1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        MySQL8.0大表秒加字段,是真的嗎?

        共 2900字,需瀏覽 6分鐘

         ·

        2020-09-12 21:28

        前言:

        很早就聽說 MySQL8.0 支持快速加列,可以實(shí)現(xiàn)大表秒級(jí)加字段。筆者自己本地也有8.0環(huán)境,但一直未進(jìn)行測(cè)試。本篇文章我們就一起來看下 MySQL8.0 快速加列到底要如何操作。

        ? 1.了解背景信息

        表結(jié)構(gòu)的變更是業(yè)務(wù)運(yùn)行過程中比較常見的需求之一,在 MySQL 的環(huán)境中,可以使用 Alter 語句來完成這些操作,這些 Alter 語句對(duì)應(yīng)的操作通常也稱之為 DDL 操作。通常情況下大表的 DDL 操作都會(huì)對(duì)業(yè)務(wù)有很明顯的影響,需要在業(yè)務(wù)空閑,或者是維護(hù)的時(shí)候做。MySQL 5.7 支持 Online DDL,大部分 DDL 不影響對(duì)表的讀取和寫入,但是依然會(huì)消耗非常多的時(shí)間,且占用額外的磁盤空間,并會(huì)造成主從延遲。所以大表 DDL 仍是一件令 DBA 頭痛的事。

        聽聞 MySQL 8.0 解決了這件令 DBA 頭痛的事,那讓我們來詳細(xì)了解下吧。想了解新功能,最簡(jiǎn)單的方法就是查閱官方文檔。查閱官方文檔得知,快速加列即 Instant Add Column?,該功能自 MySQL 8.0.12 版本引入,是由騰訊游戲DBA團(tuán)隊(duì)貢獻(xiàn)。注意一下,此功能只適用于 InnoDB 表。

        ? 2.快速加列測(cè)試

        快速加列采用的是 instant 算法,使得添加列時(shí)不再需要 rebuild 整個(gè)表,只需要在表的 metadata 中記錄新增列的基本信息即可。在 alter 語句后增加 ALGORITHM=INSTANT?即代表使用 instant 算法,?如果未明確指定,則支持 instant 算法的操作會(huì)默認(rèn)使用。如果 ALGORITHM=INSTANT 指定但不支持,則操作立即失敗并顯示錯(cuò)誤。

        關(guān)于列的 DDL 操作,是否支持 instant 等算法,官方文檔給出了一個(gè)表格,現(xiàn)整理如下,星號(hào)表示不是全部支持,有依賴項(xiàng)。

        操作InstantIn PlaceRebuilds Table允許并發(fā)DML僅修改元數(shù)據(jù)
        添加列Yes*YesNo*Yes*No
        刪除列NoYesYesYesNo
        重命名列NoYesNoYes*Yes
        更改列順序NoYesYesYesNo
        設(shè)置列默認(rèn)值YesYesNoYesYes
        更改列數(shù)據(jù)類型NoNoYesNoNo
        擴(kuò)展VARCHAR列大小NoYesNoYesYes
        刪除列默認(rèn)值YesYesNoYesYes
        更改自動(dòng)增量值NoYesNoYesNo*
        設(shè)置列為nullNoYesYes*YesNo
        設(shè)置列not nullNoYes*Yes*YesNo
        修改ENUM/SET列的定義YesYesNoYesYes

        instant 算法使用最廣泛的應(yīng)該是添加列了,可以看到使用該算法還是有些限制的,一些限制如下:

        • 如果 alter 語句包含了 add column 和其他的操作,其中有操作不支持 instant 算法的,那么 alter 語句會(huì)報(bào)錯(cuò),所有的操作都不會(huì)執(zhí)行。
        • 只能順序加列, 僅支持在最后添加列,而不支持在現(xiàn)有列的中間添加列。
        • 不支持壓縮表,即該表行格式不能是 COMPRESSED。
        • 不支持包含全文索引的表。
        • 不支持臨時(shí)表。
        • 不支持那些在數(shù)據(jù)字典表空間中創(chuàng)建的表。

        說的再多不如實(shí)際來測(cè)下,下面我們以 8.0.19 版本為例來實(shí)際驗(yàn)證下:

        #?利用sysbench生成一張1000W的大表
        mysql>?select?version();
        +-----------+
        |?version()?|
        +-----------+
        |?8.0.19????|
        +-----------+
        1?row?in?set?(0.00?sec)

        mysql>?select?count(*)?from?sbtest1;
        +----------+
        |?count(*)?|
        +----------+
        |?10000000?|
        +----------+

        #?增加無默認(rèn)值的列
        mysql>?alter?table?sbtest1?add?column?col1?varchar(20),?algorithm=instant;
        Query?OK,?0?rows?affected?(0.63?sec)
        Records:?0??Duplicates:?0??Warnings:?0

        #?增加有默認(rèn)值的列
        mysql>?alter?table?sbtest1?add?column?create_time?timestamp?NOT?NULL?DEFAULT?CURRENT_TIMESTAMP?COMMENT?'創(chuàng)建時(shí)間',?algorithm=instant;
        Query?OK,?0?rows?affected?(0.58?sec)
        Records:?0??Duplicates:?0??Warnings:?0

        #?不顯式指定instant算法
        mysql>?alter?table?sbtest1?add?column?col2?varchar(20);
        Query?OK,?0?rows?affected?(0.55?sec)
        Records:?0??Duplicates:?0??Warnings:?0

        #?設(shè)置列的默認(rèn)值
        mysql>?alter?table?sbtest1?alter?column?col1?set?default?'sql',algorithm=instant;
        Query?OK,?0?rows?affected?(0.02?sec)
        Records:?0??Duplicates:?0??Warnings:?0

        #?指定In?Place算法添加列,(5.7版本添加列使用該算法)
        mysql>?alter?table?sbtest1?add?column?col_inplace?varchar(20),algorithm=inplace;
        Query?OK,?0?rows?affected?(1?min?23.30?sec)
        Records:?0??Duplicates:?0??Warnings:?0


        通過以上測(cè)試,我們可以發(fā)現(xiàn),使用 instant 算法添加列基本都在 1s 內(nèi)完成,對(duì)于大表來說這個(gè)速度是非??斓?,業(yè)務(wù)基本無感知。當(dāng)使用 5.7 版本的 inplace 算法時(shí),則添加列的時(shí)間上升至數(shù)分鐘。對(duì)比看來 8.0 版本的快速加列功能確實(shí)非常實(shí)用!

        總結(jié):

        雖然快速加列存在一些限制, instant 算法也只適用于部分 DDL 操作,但 8.0 的這項(xiàng)新功能已經(jīng)足以令人興奮,很大程度上解決了大表加字段的大難題。通過這篇文章,希望各位能了解到這項(xiàng)新功能,是不是想升級(jí)到 8.0 了呢,可以著手準(zhǔn)確起來了。

        推薦閱讀


        (點(diǎn)擊標(biāo)題可跳轉(zhuǎn)閱讀)

        MySQL參數(shù)是啥,你知道嗎?

        MySQL redo與undo日志解析

        MySQL中的這幾類日志,你一定要知道

        - End -

        動(dòng)動(dòng)手指轉(zhuǎn)發(fā)、在看
        是對(duì)我最大的鼓勵(lì)

        瀏覽 298
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美肥婆xxxx | 处破初破苞一区二区三区在线播放 | 在线观看成人无码片 | 欧美精品人妻 | 午夜精品成人毛片非洲 | 人妻无码аⅴ天堂中文在线 | 亚洲无码性爱视频 | 操逼地世频 | 欧美日韩卡一卡二在线播放视频 | 黄色片91 |