一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL8.0 如何快速加列

MySQL8.0 如何快速加列

2020-09-19 22:23MySQL技術 Mysql

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

前言:

很早就聽說 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 等算法,官方文檔給出了一個表格,現整理如下,星號表示不是全部支持,有依賴項。

 

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

 

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

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

說的再多不如實際來測下,下面我們以 8.0.19 版本為例來實際驗證下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 利用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 了呢,可以著手準確起來了。

以上就是MySQL8.0 如何快速加列的詳細內容,更多關于MySQL8.0 快速加列的資料請關注服務器之家其它相關文章!

原文鏈接:https://segmentfault.com/a/1190000024426474

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩免费观看成第15集 | 人禽l交视频在线播放 视频 | 手机看片国产免费现在观看 | 2020年精品国产午夜福利在线 | 成人啪精品视频免费网站 | 精品无码人妻一区二区免费AV | 欧美一级高清片 | 色婷亚洲 | 国产成人咱精品视频免费网站 | 亚洲成色爱我久久 | 国产成人精选免费视频 | 免费视频精品一区二区三区 | 日韩人成免费网站大片 | 动漫美女人物被黄漫小说 | 手机在线观看国产精选免费 | 五月最新商场女厕所高跟嘘嘘 | ysl千人千色t9t9t9t9 | 无套暴躁白丝秘书 | 午夜在线观看视频 | 99综合在线 | 亚洲高清视频在线 | 动漫美女被羞羞产奶 | 午夜想想爱 | 欧美三级不卡在线观线看高清 | 三星w999| 91视频国产精品 | 久久天天综合 | 香蕉国产成版人视频在线观看 | 日本人黄色 | 无罩看奶禁18 | 日日爽日日操 | 国产精品亚洲va在线观看 | 成人看片免费无限观看视频 | 日本videossexx日本人 | np高h疯狂黄暴宫口 narutomanga玖辛奈之乳 | 亚洲AV永久无码精品老司机蜜桃 | 美妇在线 | 搡60一70岁的老女人小说 | 9总探花新品牛仔背带裤 | 日韩精品福利视频一区二区三区 | 波多野结衣在线中文字幕 |