成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:MySQL主鍵為什么不是連續遞增的?

數據庫 MySQL
在MySQL5.7之前,這個遞增值是直接保存在內存里面的,當服務器重啟后,MySQL會讀取表里面的最大主鍵id,然后將最大值+1作為下次遞增的值。

設計MySQL表時,我們一般會設置一個自增主鍵,從而讓主鍵索引盡可能的保持遞增的趨勢,這樣可以避免頁分裂,讓MySQL順序寫入,大大提高MySQL的性能。

但是,自增主鍵只能保持大致遞增,無法保證順序遞增。

當我們創建完一個表后,通過show create table命令,可以看到MySQL定義了AUTO_INCREMENT來指定主鍵的遞增值。

在MySQL5.7之前,這個遞增值是直接保存在內存里面的,當服務器重啟后,MySQL會讀取表里面的最大主鍵id,然后將最大值+1作為下次遞增的值。

在MySQL8.0時,將其優化為了保存在redo log中,從而實現了遞增值的持久化。

那都有哪些情況可能導致主鍵不能連續遞增呢?

首先我們要知道的是,MySQL對于主鍵遞增值得使用是一次性的,即每次獲取完遞增值之后,不管接下來的語句是否能真正執行成功,這個遞增值都不會再回收利用了。

1、唯一索引沖突導致的主鍵不連續

有時為了滿足業務的需要,我們有時會對表中的字段設置唯一索引。但是當唯一索引沖突時,會產生什么問題呢?

以上面的user表為例,我們對name設置唯一索引。

我們執行兩次以下語句:

INSERT into user values (null,'張三','123456');

不難猜到,第二次的執行結果肯定會報錯:

我們在上面已經提到,MySQL對于遞增值的使用是一次性的,那么第二次執行插入時,不管語句成功還是失敗,那么這個遞增值就會浪費掉。

這時,我們再執行一條正常的不沖突的插入語句,會發現主鍵id產生了間隔。

2、事務回滾會造成主鍵不連續

與唯一索引沖突類似,當我們在一個事務中執行插入語句時,那么必然會向MySQL申請一個遞增值作為主鍵id,如果最后事務沒有提交,而是回滾,那么這個遞增值自然也就浪費掉了。

3、批量插入會造成主鍵不連續

為了保證主鍵id的唯一性,在申請自增id時,MySQL會對申請操作加鎖。一般情況下,這個申請動作會很快。

對于一般的批量插入,比如insert into ... values(xxx),由于插入的Value個數可以提前計算得出,MySQL會一次性的申請足夠數量的id,以保證性能。

但是對于insert into ... select 這種語句就有點麻煩了,由于無法確定到底需要申請多個主鍵id,如果插入一條申請一個的話,假設要插入100萬條記錄,那就得申請100萬次,可想而知性能會有多么差勁。

所以對于這種批量插入的語句,MySQL采用了一種翻倍申請的優化策略:

語句執行時,第一次申請一個自增id,第二次申請2個自增id,第三次申請4個自增id...

即每次申請的數量都比上次多一倍,這樣雖然會浪費一些自增id,但是可以保證插入的效率,從性能角度來看,是可以接受的。

自增id為什么不回退復用

大家可能會有點疑問,為什么自增id是一次性使用的?

其實原因也很簡單,大家稍微一想就明白了。

假設有兩個事務在同時執行,為了保證自增id的唯一性,MySQL會對申請動作加鎖,然后兩個事務各獲得一個自增id。比如事務1申請到了自增id100,事務2申請到了自增id101。

當事務2成功提交,事務1因為某些原因回滾了。

如果我們要回退復用事務1的id,將AUTO_INCREMENT又設置成了100+1,那么下一個事務來申請自增id時,就會拿到101,而這時101已經被事務2用掉了,就會造成主鍵沖突。

當然我們也可以每次都讓MySQL檢查一下主鍵是否沖突,如果沖突就跳過這個id,但是這樣一來,本來申請自增id這個很輕的動作就會變得很重,對性能的影響就會很大。

所以,從性能角度考慮,InnoDB只保證了主鍵id是大致遞增的,而不保證是順序遞增的。?

責任編輯:姜華 來源: 今日頭條
相關推薦

2021-02-19 10:02:57

HTTPSJava安全

2022-07-06 13:48:24

RedisSentinel機制

2023-12-06 09:10:28

JWT微服務

2020-10-24 15:50:54

Java值傳遞代碼

2021-01-21 07:53:29

面試官Promis打印e

2021-12-20 10:30:33

forforEach前端

2023-12-20 14:35:37

Java虛擬線程

2023-11-30 08:16:19

SpringjarTomcat

2024-10-24 09:22:30

2023-07-05 08:17:38

JDK動態代理接口

2022-12-22 14:32:37

JavaScript編程語言

2023-06-05 07:57:53

Kafka消息事務消息

2020-04-21 15:59:50

MySQL自增主鍵數據庫

2020-05-06 15:02:58

MySQL數據庫技術

2024-03-13 07:53:57

弱引用線程工具

2021-09-28 17:48:20

MySQL主鍵索引

2021-09-07 10:44:33

Java 注解開發

2020-08-24 10:55:41

數據庫雙寫代碼

2020-12-23 13:29:15

微服務架構面試官

2024-01-11 08:12:20

重量級監視器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文福利视频 | 一区二区三区在线看 | 欧美无乱码久久久免费午夜一区 | 青青久草 | 日韩成人国产 | 欧美日韩三级 | 久久在视频 | 国产精品成人一区二区三区 | 美女一级a毛片免费观看97 | 香蕉婷婷 | 成人在线精品视频 | 紧缚调教一区二区三区视频 | 久久夜色精品国产 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 毛片一级片 | 精品国产一区二区三区性色 | 亚洲婷婷六月天 | 资源首页二三区 | 日韩三级一区 | 91视在线国内在线播放酒店 | 免费午夜视频在线观看 | 国产日韩久久 | 亚洲自拍一区在线观看 | 日批日韩在线观看 | av香蕉 | 盗摄精品av一区二区三区 | 免费观看一级特黄欧美大片 | 国产精品亚洲第一 | 日本淫视频 | 成人精品| 九九综合 | 男人影音 | 操亚洲 | 黄视频免费 | 久草.com | 美国十次成人欧美色导视频 | 欧美一级二级三级视频 | 成人在线视频免费观看 | 国产一区二区自拍 | 精品美女在线观看视频在线观看 | av手机在线 |