日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 加字段_MySQL8.0大表秒加字段,是真的吗?

發布時間:2023/12/10 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 加字段_MySQL8.0大表秒加字段,是真的吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:

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

? 1.了解背景信息

表結構的變更是業務運行過程中比較常見的需求之一,在 MySQL 的環境中,可以使用 Alter 語句來完成這些操作,這些 Alter 語句對應的操作通常也稱之為 DDL 操作。通常情況下大表的 DDL 操作都會對業務有很明顯的影響,需要在業務空閑,或者是維護的時候做。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 指定但不支持,則操作立即失敗并顯示錯誤。

關于列的 DDL 操作,是否支持 instant 等算法,官方文檔給出了一個表格,現整理如下,星號表示不是全部支持,有依賴項。

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

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

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

說的再多不如實際來測下,下面我們以 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?'創建時間',?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

#?設置列的默認值
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

通過以上測試,我們可以發現,使用 instant 算法添加列基本都在 1s 內完成,對于大表來說這個速度是非常快的,業務基本無感知。當使用 5.7 版本的 inplace 算法時,則添加列的時間上升至數分鐘。對比看來 8.0 版本的快速加列功能確實非常實用!

總結:

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

推薦閱讀

(點擊標題可跳轉閱讀)

MySQL參數是啥,你知道嗎?

MySQL redo與undo日志解析

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

- End -動動手指轉發、在看是對我最大的鼓勵

總結

以上是生活随笔為你收集整理的mysql 加字段_MySQL8.0大表秒加字段,是真的吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。