MySQL8.0 如何快速加列
前言:
很早就聽說 MySQL8.0 支持快速加列,可以實現(xiàn)大表秒級加字段。筆者自己本地也有8.0環(huán)境,但一直未進行測試。本篇文章我們就一起來看下 MySQL8.0 快速加列到底要如何操作。
1.了解背景信息
表結(jié)構(gòu)的變更是業(yè)務(wù)運行過程中比較常見的需求之一,在 MySQL 的環(huán)境中,可以使用 Alter 語句來完成這些操作,這些 Alter 語句對應(yīng)的操作通常也稱之為 DDL 操作。通常情況下大表的 DDL 操作都會對業(yè)務(wù)有很明顯的影響,需要在業(yè)務(wù)空閑,或者是維護的時候做。MySQL 5.7 支持 Online DDL,大部分 DDL 不影響對表的讀取和寫入,但是依然會消耗非常多的時間,且占用額外的磁盤空間,并會造成主從延遲。所以大表 DDL 仍是一件令 DBA 頭痛的事。
聽聞 MySQL 8.0 解決了這件令 DBA 頭痛的事,那讓我們來詳細了解下吧。想了解新功能,最簡單的方法就是查閱官方文檔。查閱官方文檔得知,快速加列即 Instant Add Column ,該功能自 MySQL 8.0.12 版本引入,是由騰訊游戲DBA團隊貢獻。注意一下,此功能只適用于 InnoDB 表。
2.快速加列測試
快速加列采用的是 instant 算法,使得添加列時不再需要 rebuild 整個表,只需要在表的 metadata 中記錄新增列的基本信息即可。在 alter 語句后增加 ALGORITHM=INSTANT 即代表使用 instant 算法, 如果未明確指定,則支持 instant 算法的操作會默認使用。如果 ALGORITHM=INSTANT 指定但不支持,則操作立即失敗并顯示錯誤。
關(guān)于列的 DDL 操作,是否支持 instant 等算法,官方文檔給出了一個表格,現(xiàn)整理如下,星號表示不是全部支持,有依賴項。
操作 | 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è)置列默認值 | Yes | Yes | No | Yes | Yes |
更改列數(shù)據(jù)類型 | No | No | Yes | No | No |
擴展VARCHAR列大小 | No | Yes | No | Yes | Yes |
刪除列默認值 | Yes | Yes | No | Yes | Yes |
更改自動增量值 | 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 語句會報錯,所有的操作都不會執(zhí)行。
- 只能順序加列, 僅支持在最后添加列,而不支持在現(xiàn)有列的中間添加列。
- 不支持壓縮表,即該表行格式不能是 COMPRESSED。
- 不支持包含全文索引的表。
- 不支持臨時表。
- 不支持那些在數(shù)據(jù)字典表空間中創(chuàng)建的表。
說的再多不如實際來測下,下面我們以 8.0.19 版本為例來實際驗證下:
# 利用sysbench生成一張1000W的大表 mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.19 | +-----------+ 1 row in set (0.00 sec) mysql> select count(*) from sbtest1; +----------+ | count(*) | +----------+ | 10000000 | +----------+ # 增加無默認值的列 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 # 增加有默認值的列 mysql> alter table sbtest1 add column create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間', 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è)置列的默認值 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)完成,對于大表來說這個速度是非??斓?,業(yè)務(wù)基本無感知。當使用 5.7 版本的 inplace 算法時,則添加列的時間上升至數(shù)分鐘。對比看來 8.0 版本的快速加列功能確實非常實用!
總結(jié):
雖然快速加列存在一些限制, instant 算法也只適用于部分 DDL 操作,但 8.0 的這項新功能已經(jīng)足以令人興奮,很大程度上解決了大表加字段的大難題。通過這篇文章,希望各位能了解到這項新功能,是不是想升級到 8.0 了呢,可以著手準確起來了。
以上就是MySQL8.0 如何快速加列的詳細內(nèi)容,更多關(guān)于MySQL8.0 快速加列的資料請關(guān)注腳本之家其它相關(guān)文章!
- Mysql Online DDL的使用詳解
- MySQL DDL 引發(fā)的同步延遲該如何解決
- 詳解MySQL8.0原子DDL語法
- MySQL在線DDL工具 gh-ost的原理解析
- MySQL ddl語句的使用
- Mysql DDL常見操作匯總
- 解析MySQL8.0新特性——事務(wù)性數(shù)據(jù)字典與原子DDL
- MySQL數(shù)據(jù)定義語言DDL的基礎(chǔ)語句
- MySQL8.0 DDL原子性特性及實現(xiàn)原理
- MySQL在線DDL gh-ost使用總結(jié)
- 解決MySQL 5.7中定位DDL被阻塞的問題
- MySQL8.0新特性之支持原子DDL語句
- MySQL曝中間人攻擊Riddle漏洞可致用戶名密碼泄露的處理方法
- MySQL 8.0 Online DDL快速加列的相關(guān)總結(jié)
相關(guān)文章
mysql 導(dǎo)入導(dǎo)出數(shù)據(jù)庫以及函數(shù)、存儲過程的介紹
本篇文章是對mysql中的導(dǎo)入導(dǎo)出數(shù)據(jù)庫命令以及函數(shù)、存儲過程進行了詳細的分析介紹,需要的朋友參考下2013-07-07MySQL數(shù)據(jù)類型中DECIMAL的用法實例詳解
這篇文章主要介紹了MySQL數(shù)據(jù)類型中DECIMAL的用法實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-10-10MySQL中列轉(zhuǎn)行和行轉(zhuǎn)列總結(jié)解決思路
最近工作中用到了好幾次列轉(zhuǎn)行,索性做個小總結(jié),下面這篇文章主要給大家介紹了關(guān)于MYSQL如何列轉(zhuǎn)行的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01mysql實現(xiàn)將字符串字段轉(zhuǎn)為數(shù)字排序或比大小
這篇文章主要介紹了mysql實現(xiàn)將字符串字段轉(zhuǎn)為數(shù)字排序或比大小,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06