国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MySQL 主鍵自增注意事項,你學會了嗎?

數據庫 MySQL
對于上面提到的兩個使用 UUID 作為主鍵的問題,使用主鍵自增顯然都可以解決。主鍵自增,每次只需要往樹的末尾添加就行了,基本上不會涉及到頁分裂問題;主鍵自增意味著主鍵是數字,占用的存儲空間相對來說就比較小,對非聚簇索引的影響也會小一些。

很多小伙伴應該知道,在 MySQL 中主鍵不應該使用隨機字符串。但是主鍵不用隨機字符串用什么?主鍵自增?主鍵自增就是最佳方案嗎?有沒有其他坑?今天我們就來討論下這個話題。

1. 為什么不用 UUID

經過上篇文章的介紹,我們知道在 MySQL 中,主鍵索引就是聚簇索引,MySQL 表中的數據是根據主鍵值聚集在一起的,聚簇索引是一棵 B+Tree,這棵樹中的數據是有序的。

所以,如果我們使用 UUID 字符串作為主鍵,那么就會導致每次數據插入的時候,都需要在 B+Tree 中尋找到適合它自己的位置,找到之后就有可能要挪動后面的節點(就像在數組中插入一條記錄),挪動后面的節點,就有可能涉及到頁分裂,插入效率就會降低。

另一方面,在非聚簇索引中,葉子結點保存的是主鍵值,主鍵如果是一個很長的 UUID 字符串,就會占據較大的存儲空間(相對 int 而言),那么同一個葉子結點能夠保存的主鍵值數量就會減少,進而可能會導致樹變高,樹變高,意味著查詢的時候 IO 次數增加,查詢效率降低。

基于上面的分析,我們在 MySQL 中盡量不使用 UUID 作為主鍵,不用 UUID,可能會有小伙伴想到,那我使用主鍵自增行不行?

對于上面提到的兩個使用 UUID 作為主鍵的問題,使用主鍵自增顯然都可以解決。主鍵自增,每次只需要往樹的末尾添加就行了,基本上不會涉及到頁分裂問題;主鍵自增意味著主鍵是數字,占用的存儲空間相對來說就比較小,對非聚簇索引的影響也會小一些。

那么主鍵自增就是最佳方案嗎?主鍵自增有沒有一些需要注意的問題?

2. 主鍵自增的問題

以下內容,有一個共同的大前提,就是我們的表設置了主鍵自增。

一般來說,主鍵自增是沒有什么問題的。但是,如果在高并發環境下,就會有問題了。

首先最容易想到的就是在高并發插入的時候產生的尾部熱點問題,并發插入時,大家都需要去查詢這個值然后計算出自己的主鍵值,那么主鍵的上界就會成為熱點數據,并發插入時這里會產生鎖競爭。

為了解決這個問題,我們就需要選擇適合自己的 innodb_autoinc_lock_mode。

2.1 數據插入的三種形式

首先,我們在向數據表中插入數據的時候,一般來說有三種不同的形式,分別如下:

  • insert into user(name) values('javaboy') 或者 replace into user(name) values('javaboy') ,這種沒有嵌套子查詢并且能夠確定具體插入多少行的插入叫做 simple insert,不過需要注意的是 INSERT ... ON DUPLICATE KEY UPDATE 不算是 simple insert。
  • load data 或者 insert into user select ... from ....,這種都是批量插入,叫做 bulk insert,這種批量插入有一個特點就是插入多少條數據在一開始是未知的。
  • insert into user(id,name) values(null,'javaboy'),(null,'江南一點雨'),這種也是批量插入,但是跟第二種又不太一樣,這種里邊包含了一些自動生成的值(本案例中的主鍵自增),并且能夠確定一共插入多少行,這種稱之為 mixed insert,對于前面第一點提到的 INSERT ... ON DUPLICATE KEY UPDATE 也算是一種 mixed insert。

將數據插入分為這三類,主要是因為在主鍵自增的時候,鎖的處理方案不同,我們繼續往下看。

2.2 innodb_autoinc_lock_mode

我們可以通過控制 innodb_autoinc_lock_mode 變量的值,來控制在主鍵自增的時候,MySQL 鎖的處理思路。

innodb_autoinc_lock_mode 變量一共有三個不同的取值:

  • 0: 這個表示 traditional,在這種模式下,我們上面提到的三種不同的插入 SQL,對于自增鎖的處理方案是一致的,都是在插入 SQL 語句開始的時候,獲取到一個表級的 AUTO-INC 鎖,然后當插入 SQL 執行完畢之后,再釋放掉這把鎖,這樣做的好處是可以確保在批量插入的時候,自增主鍵是連續的。
  • 1: 這個表示 consecutive,在這種模式下,對 simple insert(能夠確定具體插入行數的,對應上面 1、3 兩種情況)做了一些優化,由于 simple insert 插入多少行這個很好計算,于是可以一次性生成幾個連續的值用在對應的插入 SQL 語句上,這樣就可以提前釋放掉 AUTO-INC 鎖,可以減少鎖等待,提高并發插入效率。
  • 2: 這個表示 interleaved,這種情況下不存在 AUTO-INC 鎖,來一個處理一個,批量插入的時候,就有可能出現主鍵雖然自增,但是不連續的問題。

從上面的介紹中小伙伴們可以看到,實際上第三種,也就是 innodb_autoinc_lock_mode 取值為 2 的情況下,并發效率是最強的,那么我們是不是就應該設置 innodb_autoinc_lock_mode=2 呢?

這得看情況。

松哥之前寫過一篇文章和小伙伴們介紹 MySQL binlog 日志文件的三種格式:

  • row:binlog 中記錄的是具體的值而不是原始的 SQL,舉一個簡單例子,假設表中有一個字段是 UUID,用戶執行的 SQL 是 insert into user(username,uuid) values('javaboy',uuid()),那么最終記錄到 binlog 中的 SQL 是 insert into user(username,uuid) values('javaboy',‘0212cfa0-de06-11ed-a026-0242ac110004’)。
  • statement:binlog 中記錄的就是原始的 SQL 了,以 row 中的為例,最終 binlog 中記錄的就是 insert into user(username,uuid) values('javaboy',uuid())。
  • mixed:在這種模式下,MySQL 會根據具體的 SQL 語句來決定日志的形式,也就是在 statement 和 row 之間選擇一種。

對于這三種不同的模式,很明顯,在主從復制的時候,statement 模式可能會導致主從數據不一致,所以現在 MySQL 默認的 binlog 格式都是 row。

回到我們的問題:

  • 如果 binlog 格式是 row,那么我們就可以設置 innodb_autoinc_lock_mode 的值為 2,這樣就能盡最大程度保證數據并發插入的能力,同時不會發生主從數據不一致的問題。
  • 如果 binlog 格式是 statement,那么我們最好設置 innodb_autoinc_lock_mode 的值為 1,這樣對于 simple insert 的并發插入能力進行了提高,批量插入還是先獲取 AUTO-INC 鎖,等插入成功之后再釋放,這樣也能避免主從數據不一致,保證數據復制的安全性。
  • 以上兩點主要是針對 InnoDB 存儲引擎,如果是 MyISAM 存儲引擎,都是先獲取 AUTO-INC 鎖,插入完成再釋放,相當于 innodb_autoinc_lock_mode 變量的取值對 MyISAM 不生效。

2.3 實踐

接下來我們來通過一個簡單的 SQL 來和小伙伴們演示一下 innodb_autoinc_lock_mode 不同取值對應不同結果的情況。

首先,我們可以通過如下 SQL 查看當前 innodb_autoinc_lock_mode 的取值:

圖片圖片

可以看到,我使用的 8.0.32 這個版本目前默認值是 2。

我先把它改成 0,修改方式就是在 /etc/my.cnf 文件中添加一行 innodb_autoinc_lock_mode=0:

圖片圖片

改完之后再重啟查看,如下:

圖片圖片

可以看到,現在就已經改過來了。

現在假設我有如下表:

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=100 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

這個自增是從 100 開始計的,現在假設我有如下插入 SQL:

insert into user(id,username) values(1,'javaboy'),(null,'江南一點雨'),(3,'www.javaboy.org'),(null,'lisi');

插入完成之后,我們來看查詢結果:

圖片圖片

按照我們前文的介紹,這個情況應該是可以解釋的通的,我這里不再贅述。

接下來,我把 innodb_autoinc_lock_mode 取值改為 1,如下:

圖片圖片

還是上面相同的 SQL,我們再執行一遍。執行完成之后結果也和上文相同。

但是!!!當上面的 SQL 執行完畢之后,如果我們還想再插入數據,并且新插入的 ID 不指定值,則我們發現自動生成的 ID 值為 104。這就是因為我們設置了 innodb_autoinc_lock_mode=1,此時,執行 simple insert 插入的時候,系統一看我要插入 4 條記錄,就直接給我提前拿了 4 個 ID 出來,分別是 100、101、102 以及 103,結果該 SQL 實際上只用了兩個 ID,剩下兩個沒用,但是下次插入還是從 104 開始了。

3. 小結

好啦,這就是關于主鍵自增的一個小小知識點,小伙伴們一定要根據實際情況來為 innodb_autoinc_lock_mode 屬性取一個合適的值。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2022-12-06 07:53:33

MySQL索引B+樹

2023-05-05 06:54:07

MySQL數據查詢

2023-03-26 22:31:29

2023-03-07 07:50:15

Transactio事務代碼

2025-03-27 03:40:00

分布式系統Kafka

2024-01-19 08:25:38

死鎖Java通信

2023-01-10 08:43:15

定義DDD架構

2023-07-26 13:11:21

ChatGPT平臺工具

2024-02-04 00:00:00

Effect數據組件

2023-11-01 07:28:31

MySQL日志維護

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型

2011-04-20 14:52:02

數據庫優化

2023-01-30 09:01:54

圖表指南圖形化

2024-05-06 00:00:00

InnoDBView隔離

2023-12-12 08:02:10

2024-07-31 08:39:45

Git命令暫存區

2024-08-06 09:47:57

2022-07-08 09:27:48

CSSIFC模型

2023-10-10 11:04:11

Rust難點內存
點贊
收藏

51CTO技術棧公眾號

欧美三级中文字| 色先锋久久影院av| 青青视频在线播放| 成人免费在线网址| 中文字幕国产精品| 欧美视频完全免费看| 18涩涩午夜精品.www| 国产精品91一区二区| 欧美国产先锋| 亚洲欧美校园春色| 成人在线视频www| 国产在线观看www| 99中文字幕一区| 日本调教视频在线观看| 久久精品网站视频| 免费成人深夜夜行网站视频| 国产免费高清一区| 欧美最猛性xxxxx亚洲精品| 精品国偷自产在线视频99| 日韩经典中文字幕| 日韩欧美一二三区| 欧美日韩一区小说| 一本大道久久a久久精二百| 亚洲一线二线三线视频| 国产精品家庭影院| 国产日韩亚洲欧美综合| 99精品久久99久久久久| 粉嫩av亚洲一区二区图片| 韩国精品在线观看| 麻豆国产欧美日韩综合精品二区| 国产伦理一区| 欧美日韩国产精品一区二区亚洲| 成人在线丰满少妇av| 女人抽搐喷水高潮国产精品| 日本精品在线播放| 四虎在线精品| 黄色日韩网站| 日韩一区二区三区四区五区 | vam成人资源在线观看| 黄色成人在线网| 九色porny在线| 日本在线免费播放| 黄色在线网站| 国产毛片在线看| 性色视频在线观看| 真不卡电影网| 无线免费在线视频| 免费在线黄色影片| 北岛玲一区二区三区| 亚洲天天影视| 九七久久人人| 超碰97免费在线| 国产免费不卡| 福利视频一区| 中文无码日韩欧| 欧美aaaaa级| 欧美日韩性在线观看| 天天久久综合| 日韩视频免费| 奇米色777欧美一区二区| 国产美女一区二区| 不卡的av在线播放| 久久亚洲一区二区三区四区| 99久久伊人精品| 国产女同互慰高潮91漫画| 中国色在线观看另类| 一区二区视频免费在线观看| 亚洲国产欧美日韩另类综合 | 欧美性生活大片视频| 欧美日韩电影一区| 精品国产百合女同互慰| 日韩精品中文字幕一区| 亚洲精品在线观看www| 亚洲欧洲午夜一线一品| 欧美第一淫aaasss性| 国产精品成人播放| 成人av中文| 亚洲人成网站在线观看播放| 和岳每晚弄的高潮嗷嗷叫视频| 国产又黄又大又粗视频| 久久.com| 中文字幕免费在线| www 日韩| 日韩影院在线| 视频一区中文字幕精品| 日韩av不卡一区| 日韩精品一二| 国产日韩三级在线| 亚洲婷婷在线视频| 婷婷中文字幕一区三区| 天天做天天摸天天爽国产一区| 欧美日韩人人澡狠狠躁视频| 欧美性生活影院| 日韩成人av在线| 欧美成人国产va精品日本一级| 91福利视频在线观看| 亚洲一区二区三区四区在线播放 | 先锋资源久久| 久久久久网站| 成人的网站免费观看| 亚洲猫色日本管| 欧美日韩1区2区| 一区二区三欧美| 欧美专区在线播放| 国产一区二区三区四区五区加勒比| 综合视频免费看| 亚洲色图38p| 色播色播色播色播色播在线| 色a资源在线| 日韩精品视频一区二区三区| 亚洲国产精品成人| 国产一区二区看久久| 国产精品女同一区二区三区| 欧美日韩一区二区三区在线看| 中文字幕欧美精品日韩中文字幕| 国产精品极品美女在线观看免费| 视频一区二区三区免费观看| 五月天av在线播放| 亚洲成人三级| 精品国产亚洲一区二区三区| 中文字幕一区二区三区欧美日韩| 国产一区二区美女| 午夜电影一区二区三区| 亚洲欧美日韩网| 国产日产久久高清欧美一区| 久久天天东北熟女毛茸茸| 屁屁影院在线观看| 欧美黑人巨大xxxxx| 欧美丰满日韩| www.色综合.com| 日本韩国一区二区| 久久深夜福利免费观看| 国产乱码精品一区二区三区中文 | 国产毛片一区二区| 亚洲成a人在线观看| 亚洲欧美综合精品久久成人| 91久久久久久久久久久久久| 久久天天东北熟女毛茸茸| 羞羞视频在线免费看| 日韩免费在线电影| 亚洲一区二区免费看| 亚洲视频 欧洲视频| 亚洲欧洲第一视频| 99国精产品一二二线| 久久久久久三级| av在线私库| 91日韩免费| 久久美女艺术照精彩视频福利播放| 欧美日韩在线不卡| 欧美一级淫片播放口| 最新欧美日韩亚洲| 伊人av免费在线观看| 91亚洲精品在看在线观看高清| 亚洲国产综合在线看不卡| 国产精品美日韩| 亚洲老头老太hd| av激情久久| www.aqdy爱情电影网| 日本乱码一区二区三区不卡| 在线精品视频在线观看高清| 国产欧美日韩精品一区| 亚洲欧美一区二区激情| 国产精品区一区| 性网站在线免费观看| 亚洲伊人伊成久久人综合网| 日韩精品亚洲专区| 在线一区二区三区四区五区| 欧美孕妇与黑人孕交| 国产不卡一区二区视频| 欧美人与禽性xxxxx杂性| 欧美在线资源| 亚洲一区二区在线免费看| 欧美精品制服第一页| 91九色国产ts另类人妖| 国内精品久久久久国产| 久久激情电影| 国产精品电影院| 久久激情五月丁香伊人| 在线观看免费91| 国产精品剧情| 欧美视频久久| 精品国产福利视频| 国产韩国精品一区二区三区| 国产一区二区三区网站| 国产精品综合网站| 秋霞无码一区二区| 日本h片在线| 久久精品亚洲人成影院| 久久看人人爽人人| 亚洲色图av在线| 色综合666| 日本三级视频在线观看| 久久久久久久久久久9不雅视频 | 91九色露脸| 国产一级性片| gogo久久日韩裸体艺术| 99精品视频中文字幕| 亚洲一区第一页| 日本一区二区在线| 黄色网在线播放|