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

一道經典的MySQL面試題,答案出現三次反轉

數據庫 MySQL
前幾天偶然看到大家在討論一道面試題,而且答案也不夠統一,我感覺蠻有意思,在此就做一個解讀,整個過程中確實會有幾處反轉。

 前幾天偶然看到大家在討論一道面試題,而且答案也不夠統一,我感覺蠻有意思,在此就做一個解讀,整個過程中確實會有幾處反轉。 

[[279720]]

我們先來看下題目:

一張表,里面有ID自增主鍵,當insert了17條記錄之后,刪除了第15,16,17條記錄,再把MySQL重啟,再Insert一條記錄,這條記錄的ID是18還是15.

和后面的一些題目整體來看,難度不大,都是一些看起來很基礎的問題,但是這道題目引起了我的注意,因為這道題目的背景過于開放,所以答案也是不固定的,而這也是我們在技術學習中需要保持的嚴謹態度。

首先這道題整體來看,想表達的是對于MySQL中自增列的理解。

按照我們常規理解的邏輯,ID自增,應該是18,按照這個邏輯怎么都不應該是15吧?

但是這個答案對嗎?顯然不是,我們進入第一輪反轉。

確實,對于自增列的問題,這個是MySQL里面飽受詬病的老問題了。如果節點重啟,會從數據列中按照max(id)+1的方式來處理,在多環境歷史數據歸檔的情況下,如果主庫重啟,很可能會出現數據不一致的情況,記得在MySQL bug中很多人留言,說十多年前的老問題了,怎么還不解決。

而在OpenWorld上面Percona CEO Peter也再次提到了這個問題。 

一道經典的MySQL面試題,答案出現三次反轉

我認真查了一下這個bug的歷史,巧合的是,這個問題是Peter在十幾年前提出的,時光荏苒,一直沒有修復。 

一道經典的MySQL面試題,答案出現三次反轉

好的,按照MySQL bug的思路來理解,答案應該是15了。

但是這個答案對嗎?顯然不是,我們進入第二輪反轉。

這個題目的背景是不夠清晰的,這個表的存儲引擎沒有說是InnoDB還是MyISAM,所以存在不確定性,這么說的意義在于,自增列的信息在MyISAM和InnoDB中的維護邏輯是不大一樣的,在MyISAM中是存儲持久化在文件中的,當數據庫重啟之后,是可以通過持久化的信息持續對ID進行自增的,而InnoDB的自增列信息既不在.frm文件,也不在.ibd文件中,所以在此啟動的時候會按照max(id)+1的算法進行修復。

所以如果是MyISAM,則答案應該是18,而如果是InnoDB,則答案是15。

我們可以綜合對比,用一個小的測試來模擬復現,我們選擇的是MySQL 5.7環境。

為了對比明顯,我們創建兩張表test_innodb和test_myisam,分別對應InnoDB和MyISAM存儲引擎,來做同樣的操作,看看重啟后的差異情況。 

  1. >>create table test_innodb(id int primary key auto_increment,name varchar(30)) engine=innodb;>>create table test_myisam(id int primary key auto_increment,name varchar(30)) engine=myisam; 

插入幾行數據,查看數據: 

  1. >>insert into test_innodb(namevalues('aa'),('bb'),('cc');Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0 
  2. >>insert into test_myisam(namevalues('aa'),('bb'),('cc'); Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0 

查看兩張表的數據情況,數據是完全一樣。 

  1. >>select *from test_innodb;+----+------+| id | name |+----+------+| 1 | aa || 2| bb || 3 | cc |+----+------+3 rows in set (0.00 sec) 
  2. >>select *from test_myisam;+----+------+| id | name |+----+------+| 1 | aa || 2| bb || 3 | cc |+----+------+3 rows in set (0.00 sec) 

在1,2,3的基礎上,我們繼續插入值為5,跳過id值為4。 

  1. >>insert into test_innodb(id,namevalues(5,'ee');Query OK, 1 row affected (0.00 sec) 
  2. >>insert into test_myisam(id,namevalues(5,'ee'); Query OK, 1 row affected (0.00 sec) 

此時查看test_innodb自增列已經開始增長,值為6。 

  1. >>show create table test_innodb\G CREATE TABLE `test_innodb` ( `id` int(11) NOT AUTO_INCREMENT, `namevarchar(30) DEFAULT , PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf81 row in set (0.00 sec) 

刪除id=5的記錄 

  1. >>delete from test_innodb where id=5;Query OK, 1 row affected (0.01 sec) 

刪除記錄之后,自增列還是保持不變。 

  1. >>show create table test_innodb\G CREATE TABLE `test_innodb` ( `id` int(11) NOT AUTO_INCREMENT, `namevarchar(30) DEFAULT , PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf81 row in set (0.00 sec) 

同理test_myisam也做同樣的測試,結果是完全一樣的,在此略過日志。

我們停止數據庫 

  1. >>shutdown;Query OK, 0 rows affected (0.00 sec) 

重啟數據庫 

  1. #mysqld_safe --defaults-file=/data/mysql_5723/my.cnf & 

此時查看test_innodb和test_myisam的自增列就開始出現差異了。

MyISAM存儲引擎的表test_myisam的自增列還是不變,為6。 

  1. >>show create table test_myisam\G CREATE TABLE `test_myisam` ( `id` int(11) NOT AUTO_INCREMENT, `namevarchar(30) DEFAULT , PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf81 row in set (0.00 sec) 

而InnoDB存儲引擎的表test_innodb的自增列卻變為了4。 

  1. >>show create table test_innodb\G *************************** 1. row *************************** Table: test_innodbCreate TableCREATE TABLE `test_innodb` ( `id` int(11) NOT AUTO_INCREMENT, `namevarchar(30) DEFAULT , PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 

我們繼續插入一條數據,保持id列自增。 

  1. >>insert into test_innodb(namevalues('ee');Query OK, 1 row affected (0.00 sec) 
  2. >>insert into test_myisam(namevalues('ee'); Query OK, 1 row affected (0.00 sec) 

可以看到兩張表的id列已經分道揚鑣了。 

  1. >>select *from test_innodb; +----+------+| id | name |+----+------+| 1 | aa || 2 | bb || 3 | cc || 4 | ee |+----+------+4 rows in set (0.00 sec) 
  2. >>select *from test_myisam; +----+------+| id | name |+----+------+| 1 | aa || 2 | bb || 3 | cc || 6 | ee |+----+------+4 rows in set (0.00 sec) 

小結:對于MyISAM和InnoDB的表,因為存儲引擎對于自增列的實現機制不同,ID值也可能會有所不同,對于InnoDB存儲引擎的表,ID是按照max(id)+1的算法來計算的。 

[[279721]]

但是這個答案對嗎?顯然不是,因為還是不夠嚴謹,我們進入第三輪反轉。

這個問題不夠嚴謹是因為技術是逐步發展的,這個問題在MySQL 8.0中有了答案,對于InnoDB的自增列信息,如果斷電之后會直接丟失,很可能造成級聯從庫間的數據同步出現問題,而在MySQL 8.0之后,這個信息寫入了共享表空間中,所以服務重啟之后,還是可以繼續追溯這個自增列的ID變化情況的。

限于篇幅,因為測試日志是很相似的,我就直接給出測試后的日志,這是在數據庫重啟之后的自增列情況,可以看到test_innodb和test_myisam的自增列是完全一樣的。 

  1. mysql> show create table test_myisam\G*************************** 1. row *************************** Table: test_myisamCreate TableCREATE TABLE `test_myisam` ( `id` int(11) NOT AUTO_INCREMENT, `namevarchar(30) DEFAULT , PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec) 
  2. mysql> show create table test_innodb\G *************************** 1. row *************************** Table: test_innodbCreate TableCREATE TABLE `test_innodb` ( `id` int(11) NOT AUTO_INCREMENT, `namevarchar(30) DEFAULT , PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec) 

我們做一個小結:

在MySQL 8.0之前:

1)如果是MyISAM表,則數據庫重啟后,ID值為18

2)如果是InnoDB表,則數據庫重啟后,ID值為15

在MySQL 8.0開始,

1)如果是MyISAM表,則數據庫重啟后,ID值為18

2)如果是InnoDB表,則數據庫重啟后,ID值為18

此處需要補充的是,對于ID自增列,在MySQL 5.7中可以使用sys schema來進行有效監控了,可以查看視圖schema_auto_increment_columns 來進行列值溢出的有效判斷。

更難能可貴的是,如果是MySQL 5.7版本以下,雖然沒有sys schema特性,但是可以復用MySQL 5.7中的schema_auto_increment_columns 的視圖語句,也是可以對列值溢出進行有效判斷的。

 

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

2015-04-22 12:19:42

JAVAJAVA面試題答案解析

2025-05-20 08:38:03

2009-06-22 13:43:00

java算法

2009-09-08 17:45:06

CCNA考題

2020-11-11 09:19:37

前端優化面試

2024-10-11 17:09:27

2023-04-27 09:08:19

JavaScript隱式類型轉換

2016-05-05 17:45:43

Spring面試題答案

2018-03-06 15:30:47

Java面試題

2011-05-23 11:27:32

面試題面試java

2018-03-02 08:50:54

Linux面試題offer技巧

2019-08-13 08:43:07

JavaScript前端面試題

2013-05-29 10:36:08

Android開發移動開發字符串反轉

2023-02-04 18:24:10

SeataJava業務

2009-08-11 10:12:07

C#算法

2009-08-11 14:59:57

一道面試題C#算法

2014-07-28 14:00:40

linux面試題

2022-04-08 07:52:17

CSS面試題HTML

2017-11-21 12:15:27

數據庫面試題SQL

2009-08-11 15:09:44

一道面試題C#算法
點贊
收藏

51CTO技術棧公眾號

老司机午夜网站| 亚洲精品一区二区三区樱花| h片在线免费观看| 国产欧美中文在线| 香蕉久久夜色| 久久成人亚洲| 久久超碰亚洲| 亚洲黄色精品| 国产拍精品一二三| 欧美精品一二| 欧美一级淫片播放口| 看亚洲a级一级毛片| 日韩电视剧免费观看网站| 男人天堂手机在线| 欧美日韩综合在线| h网站在线免费观看| 欧美色综合久久| 婷婷成人激情| 欧美一区二区视频在线观看| 一区二区三区视频网站| 欧美色图免费看| 五月婷婷在线视频| 91精品国产91久久久久久一区二区| 国产女主播在线写真| 欧美在线观看一二区| 免费福利在线视频| 欧美三级资源在线| av电影免费在线观看| 欧美精品一区二区三区久久久 | 麻豆免费网站| 亚洲精品日产精品乱码不卡| 一级毛片免费视频| 色系网站成人免费| а√天堂在线官网| 亚洲性线免费观看视频成熟| 国产视频一区二| 2019中文字幕在线免费观看| 日韩伦理一区| 久久99精品久久久久久秒播放器 | 正在播放久久| 91亚洲永久精品| 色噜噜狠狠狠综合欧洲色8| 欧美亚洲日本网站| 理论电影国产精品| 污片在线免费看| 在线免费一区三区| 自拍偷拍亚洲图片| 欧美成ee人免费视频| 欧洲激情综合| 精品久久久久久久久久久久包黑料 | 亚洲免费资源在线播放| 欧美视频在线一区| 天天色综合6| 亚洲第一二区| 亚洲一二三专区| 黄色一级在线视频| 男女啪啪网站视频| 久久先锋影音av| 日本午夜在线| 久久久91精品国产一区二区精品 | 国产不卡精品视男人的天堂| 91亚洲国产| 日韩欧美一区二区视频在线播放 | 日韩亚洲欧美视频| 亚洲精品亚洲人成人网| 美女国产在线| 欧美不卡视频一区发布| 亚洲国产不卡| 免费毛片小视频| 日韩欧美中文字幕在线播放| 日韩影片中文字幕| 国产精品色悠悠| 国产丶欧美丶日本不卡视频| 日本一卡二卡四卡精品| 日韩视频精品在线| 在线播放日韩| 99久久精品免费看国产四区| 亚洲国产精品黑人久久久| 久久精品aaaaaa毛片| 成人h动漫精品一区二区器材| 欧美日韩国产一区| 男女午夜激情视频| 成人高清视频在线| caoporn97免费视频公开| 成人18视频日本| 国产免费一区二区| 永久亚洲成a人片777777| 精品人妻大屁股白浆无码| 欧美日韩综合一区| 免费一级欧美在线大片| 国产伦精品一区二区三区照片91 | 欧美乱做爰xxxⅹ久久久| 91在线视频播放地址| gay视频丨vk| 影音先锋男人的网站| 亚洲精品一二三区| 天堂av在线网| 成人免费视频网| 97精品久久久午夜一区二区三区| 亚洲女人天堂| 在线精品国产成人综合| 亚洲欧美清纯在线制服| 人与动性xxxxx免费视频| 国产一区二区三区在线免费观看 | 欧美日韩国产综合新一区| 99精品视频在线| 久久99久久精品国产| 极品少妇xxxx精品少妇| 污香蕉视频在线观看| 国产一区二区日韩| 日韩午夜av在线| 成r视频免费观看在线播放| 久久久国产91| 国产美女一区二区| 欧美jizzhd欧美| 不卡视频一区二区三区| 亚洲视频1区2区| 日韩一区二区三区高清在线观看| 欧美 日韩 国产 在线观看| 欧美日韩国产精品成人| 欧美变态网站| 精品视频无码一区二区三区| 在线观看亚洲视频| 国产成人欧美日韩在线电影| 成人性生交大片免费看网站| 欧美日韩综合久久| 欧美日韩中文一区| 国产一区二区三区四区老人| 亚洲私人影吧| 91精品国产综合久久香蕉| 亚洲精品成人精品456| 伊人久久大香线蕉综合网蜜芽| 高清日韩av| 国产精品白丝jk喷水视频一区| 亚洲综合一区在线| 日韩精品二区| 黄色片免费在线| 国产乱人伦精品一区二区| 欧美久久高跟鞋激| 日韩不卡在线观看日韩不卡视频| 黄页在线观看免费| 黄色成人在线免费观看| 色偷偷888欧美精品久久久| 97se亚洲国产综合自在线| aiai久久| 亚洲成人影院在线观看| 国产精品免费一区二区三区| 欧美一区二区三区的| 玖玖精品视频| 日韩伦理福利| 免费黄色一级网站| 国产va免费精品高清在线| 欧美日韩国产专区| 久久综合网络一区二区| 日韩国产网站| 99视频资源网| 91精品国产99久久久久久红楼| 欧美巨大另类极品videosbest | 在线视频中文亚洲| 久久精品一区八戒影视| 国产精品毛片av| 伊人网在线观看| 狠狠久久综合婷婷不卡| 亚洲天堂av在线播放| 亚洲视频网在线直播| 一区二区三区国产盗摄| 欧美伊人亚洲伊人色综合动图| 日本在线аv| 久久婷婷开心| 久久精品亚洲国产| 亚洲午夜精品一区二区三区他趣| 国产亚洲在线观看| 成人短视频软件网站大全app| 中出在线观看| 一级特黄录像免费播放全99| 国产精品剧情在线亚洲| 国产精品一区二区x88av| 欧美理论在线| 黄色精品视频网站| 色婷婷综合视频在线观看| 免费在线亚洲欧美| 日本一区二区精品| 欧美一区国产一区| 6080亚洲理论片在线观看| 国产一区二区久久久久| 好了av在线| 国产女同互慰高潮91漫画| av小说在线| 亚洲第一页在线| 亚洲国产aⅴ天堂久久| 五月激情综合| 日韩一区欧美二区| 一区二区三区四区中文字幕| 久久久久国产精品人| 日韩精品免费一区二区在线观看| 精品日本12videosex| 亚洲影视一区| 狠狠色丁香婷婷综合| 翔田千里一区二区| 三级欧美韩日大片在线看|