濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > MySQL8.0 如何快速加列

MySQL8.0 如何快速加列

熱門(mén)標(biāo)簽:地圖標(biāo)注客戶付款 許昌外呼增值業(yè)務(wù)線路 廣東400企業(yè)電話申請(qǐng)流程 咸陽(yáng)防封電銷卡 申請(qǐng)400電話電話價(jià)格 宜賓全自動(dòng)外呼系統(tǒng)廠家 臨沂做地圖標(biāo)注 石家莊400電話辦理公司 新鄉(xiāng)智能外呼系統(tǒng)好處

前言:

很早就聽(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)的操作通常也稱之為 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)表示不是全部支持,有依賴項(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 語(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è)速度是非??斓模瑯I(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)文章!

您可能感興趣的文章:
  • Mysql Online DDL的使用詳解
  • MySQL DDL 引發(fā)的同步延遲該如何解決
  • 詳解MySQL8.0原子DDL語(yǔ)法
  • MySQL在線DDL工具 gh-ost的原理解析
  • MySQL ddl語(yǔ)句的使用
  • Mysql DDL常見(jiàn)操作匯總
  • 解析MySQL8.0新特性——事務(wù)性數(shù)據(jù)字典與原子DDL
  • MySQL數(shù)據(jù)定義語(yǔ)言DDL的基礎(chǔ)語(yǔ)句
  • MySQL8.0 DDL原子性特性及實(shí)現(xiàn)原理
  • MySQL在線DDL gh-ost使用總結(jié)
  • 解決MySQL 5.7中定位DDL被阻塞的問(wèn)題
  • MySQL8.0新特性之支持原子DDL語(yǔ)句
  • MySQL曝中間人攻擊Riddle漏洞可致用戶名密碼泄露的處理方法
  • MySQL 8.0 Online DDL快速加列的相關(guān)總結(jié)

標(biāo)簽:日照 臺(tái)灣 合肥 貴州 鎮(zhèn)江 鷹潭 北京 阜新

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL8.0 如何快速加列》,本文關(guān)鍵詞  MySQL8.0,如何,快速,加列,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL8.0 如何快速加列》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于MySQL8.0 如何快速加列的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    宁远县| 阆中市| 临沂市| 江达县| 崇文区| 响水县| 安吉县| 大同市| 旬邑县| 阜阳市| 青川县| 阿城市| 永年县| 衡阳市| 清徐县| 当涂县| 儋州市| 棋牌| 武清区| 确山县| 比如县| 清原| 延川县| 利辛县| 咸丰县| 安庆市| 新巴尔虎左旗| 湘潭市| 铁力市| 灵璧县| 南投县| 九龙县| 休宁县| 阳曲县| 桑日县| 阿城市| 兴业县| 溧阳市| 白城市| 吉首市| 安宁市|