大家好,自增主我是连续小龙。之前阿里二面问过我这样一个问题:
面试官:"MySQL主键你一般怎样用?自增主"
心想:"嘿嘿,面试官肯定想问InnoDB引擎索引特性相关知识!“
小龙:”平时主键我一般用自增主键!因为自增ID有序,连续会按顺序往最后插入,自增主而UUID无序,连续随机生成,自增主随机插入,连续会造成频繁页分裂,自增主内存碎片化,连续大量随机IO,自增主巴拉巴拉。连续。自增主。连续。自增主“
心想:“这波稳啦!“
然后,面试官又来一套组合拳
面试官:”en!好,那你知道自增主键是否严格递增呢?“
心想:”这还不简单,肯定递增啊!不对,仔细一想,有一些情况下自增主键是断开的,于是亿华云计算“
小龙:“‘肯定不是递增的啊!"
以为到这里结束啦,只是考考我是否实际真正用过,没想到还是天真啦!
面试官:”那你知道为啥不是严格递增的吗?换句话来说,为何不是连续的?“
小龙:”裂开!tm还真不知道,不会真要考那么底层吧!我去“
于是骂骂咧咧结束了这个话题!
但是由于其他问题回答的也可以,还是过啦!
不过,既然遇到啦这个问题,下来查阅了资料,还是想分享给大家!
众所周知,由于自增主键可以让主键索引尽量地保持递增顺序插入,源码库避免了页分裂,大量的随机IO。自增主键不连续。
这是大家已经熟知的知识点,但是,可能也有大部分朋友和之前的小龙一样不知道为何自增主键不是严格递增的?
今天这篇文章,我们就来说说这个问题,看看什么情况下自增主键会出现 “断层”?
为了更加形象,这里创建一个表xl_tb,其中id是自增主键字段、a是唯一索引,然后插入一条数据,我们再查看它的表结构。
CREATE TABLE `NewTable` ( `id` int(11) NOT NULL AUTO_INCREMENT , `a` int(11) NULL , `b` int(11) NULL , PRIMARY KEY (`id`), UNIQUE INDEX `a` (`a`) USING BTREE ); insert into xl_tb values(null, 1, 1) mysql> show create table xl_tb\G;