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

MySQL8.0 如何快速加列

 更新時(shí)間:2020年09月12日 11:21:05   作者:MySQL技術(shù)  
這篇文章主要介紹了MySQL8.0 如何快速加列,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下

前言:

很早就聽說 MySQL8.0 支持快速加列,可以實(shí)現(xiàn)大表秒級(jí)加字段。筆者自己本地也有8.0環(huán)境,但一直未進(jìn)行測試。本篇文章我們就一起來看下 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ì)了解下吧。想了解新功能,最簡單的方法就是查閱官方文檔。查閱官方文檔得知,快速加列即 Instant Add Column ,該功能自 MySQL 8.0.12 版本引入,是由騰訊游戲DBA團(tuán)隊(duì)貢獻(xiàn)。注意一下,此功能只適用于 InnoDB 表。

2.快速加列測試

快速加列采用的是 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)。

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

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

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

說的再多不如實(shí)際來測下,下面我們以 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

通過以上測試,我們可以發(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)確起來了。

以上就是MySQL8.0 如何快速加列的詳細(xì)內(nèi)容,更多關(guān)于MySQL8.0 快速加列的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 如何使用mysql語句進(jìn)行多表聯(lián)查(以三個(gè)表為例)

    如何使用mysql語句進(jìn)行多表聯(lián)查(以三個(gè)表為例)

    這篇文章主要介紹了如何使用mysql語句進(jìn)行多表聯(lián)查(以三個(gè)表為例),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù)

    MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù)

    這篇文章主要介紹了MySQL基于group_concat()函數(shù)合并多行數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Ubuntu 18.04 安裝mysql5.7

    Ubuntu 18.04 安裝mysql5.7

    這篇文章主要為大家詳細(xì)介紹了Ubuntu 18.04 安裝mysql 5.7的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • MySQL數(shù)據(jù)庫跨版本遷移的實(shí)現(xiàn)三種方式

    MySQL數(shù)據(jù)庫跨版本遷移的實(shí)現(xiàn)三種方式

    本文主要介紹了MySQL數(shù)據(jù)庫跨版本遷移的實(shí)現(xiàn),主要包含mysqldump,物理文件遷移和原地升級(jí)三種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • mysql?ON?DUPLICATE?KEY?UPDATE重復(fù)插入時(shí)更新方式

    mysql?ON?DUPLICATE?KEY?UPDATE重復(fù)插入時(shí)更新方式

    這篇文章主要介紹了mysql?ON?DUPLICATE?KEY?UPDATE重復(fù)插入時(shí)更新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • mysql like 特殊字符搜索的實(shí)現(xiàn)

    mysql like 特殊字符搜索的實(shí)現(xiàn)

    在MySQL中,LIKE操作符用于在查詢數(shù)據(jù)時(shí)進(jìn)行模糊匹配,本文主要介紹了mysql like 特殊字符搜索的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • MySQL索引的一些常見面試題大全(2022年)

    MySQL索引的一些常見面試題大全(2022年)

    索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),是對(duì)表中一列或多列值進(jìn)行排序的結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于MySQL索引的一些常見面試題,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 優(yōu)化 MySQL 3 個(gè)簡單的小調(diào)整

    優(yōu)化 MySQL 3 個(gè)簡單的小調(diào)整

    本文給大家?guī)砹藘?yōu)化 MySQL 3 個(gè)簡單的小調(diào)整,需要的朋友參考下
    2018-02-02
  • MySQL 數(shù)據(jù)類型選擇原則

    MySQL 數(shù)據(jù)類型選擇原則

    MySQL支持大量的數(shù)據(jù)類型,選擇正確的類型對(duì)性能十分關(guān)鍵。本篇介紹了MySQL 的數(shù)據(jù)類型選擇原則,可以根據(jù)這些基本的原則確定數(shù)據(jù)表字段的具體數(shù)據(jù)類型。
    2021-05-05
  • mysql千萬級(jí)數(shù)據(jù)分頁查詢性能優(yōu)化

    mysql千萬級(jí)數(shù)據(jù)分頁查詢性能優(yōu)化

    本文給大家分享的是作者在使用mysql進(jìn)行千萬級(jí)數(shù)據(jù)量分頁查詢的時(shí)候進(jìn)行性能優(yōu)化的方法,非常不錯(cuò)的一篇文章,對(duì)我們學(xué)習(xí)mysql性能優(yōu)化非常有幫助
    2017-11-11

最新評(píng)論

保德县| 太白县| 龙山县| 三原县| 大埔区| 图们市| 天水市| 德化县| 远安县| 明溪县| 新干县| 凤台县| 忻城县| 武隆县| 青州市| 遵化市| 昭通市| 余干县| 隆尧县| 南江县| 宝清县| 府谷县| 通城县| 盐城市| 九寨沟县| 乐业县| 云阳县| 兴城市| 定日县| 崇仁县| 吴旗县| 来凤县| 轮台县| 清镇市| 娱乐| 那曲县| 萝北县| 宁阳县| 调兵山市| 澜沧| 白水县|