當(dāng)前位置:首頁(yè) >  站長(zhǎng) >  數(shù)據(jù)庫(kù) >  正文

MySQL8.0如何快速加列

 2020-11-05 13:41  來(lái)源: 腳本之家   我來(lái)投稿 撤稿糾錯(cuò)

  域名預(yù)訂/競(jìng)價(jià),好“米”不錯(cuò)過(guò)

這篇文章主要介紹了MySQL8.0 如何快速加列,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下

前言:

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

1.了解背景信息

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

聽(tīng)聞 MySQL 8.0 解決了這件令 DBA 頭痛的事,那讓我們來(lái)詳細(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 語(yǔ)句后增加 ALGORITHM=INSTANT 即代表使用 instant 算法, 如果未明確指定,則支持 instant 算法的操作會(huì)默認(rèn)使用。如果 ALGORITHM=INSTANT 指定但不支持,則操作立即失敗并顯示錯(cuò)誤。

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

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

如果 alter 語(yǔ)句包含了 add column 和其他的操作,其中有操作不支持 instant 算法的,那么 alter 語(yǔ)句會(huì)報(bào)錯(cuò),所有的操作都不會(huì)執(zhí)行。

只能順序加列, 僅支持在最后添加列,而不支持在現(xiàn)有列的中間添加列。

不支持壓縮表,即該表行格式不能是 COMPRESSED。

不支持包含全文索引的表。

不支持臨時(shí)表。

不支持那些在數(shù)據(jù)字典表空間中創(chuàng)建的表。

說(shuō)的再多不如實(shí)際來(lái)測(cè)下,下面我們以 8.0.19 版本為例來(lái)實(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 |
+----------+

# 增加無(wú)默認(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

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

總結(jié):

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

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

來(lái)源:腳本之家

鏈接:https://www.jb51.net/article/195492.htm

申請(qǐng)創(chuàng)業(yè)報(bào)道,分享創(chuàng)業(yè)好點(diǎn)子。點(diǎn)擊此處,共同探討創(chuàng)業(yè)新機(jī)遇!

相關(guān)標(biāo)簽
mysql

相關(guān)文章

  • MySQL5.7 集群配置的步驟

    這篇文章主要介紹了MySQL5.7集群配置的步驟,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下

    標(biāo)簽:
    mysql
  • MySQL中觸發(fā)器和游標(biāo)的介紹與使用

    這篇文章主要給大家介紹了關(guān)于MySQL中觸發(fā)器和游標(biāo)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    mysql
  • MySQL中exists、in及any的基本用法

    這篇文章主要給大家介紹了關(guān)于MySQL中exists、in及any的基本用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    mysql
  • MySQL正確修改最大連接數(shù)的3種方案

    這篇文章主要給大家介紹了關(guān)于MySQL正確修改最大連接數(shù)的3種方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    mysql
  • 教你怎么在Windows系統(tǒng)上手動(dòng)搭建MySql數(shù)據(jù)庫(kù)

    1.已經(jīng)購(gòu)買(mǎi)好的騰訊云輕量應(yīng)用服務(wù)器。2.作者本次演示使用的系統(tǒng)是WindowsServer2019,其他windows版本也可以,操作流程大同小異。3.使用Windows遠(yuǎn)程桌面連接騰訊云輕量服務(wù)器。

熱門(mén)排行

信息推薦