自增主键推荐原因

一、为什么推荐自增主键?

B+树的叶子节点是按主键从小到大一页一页往后排的。

 
用自增主键(id=1,2,3,4,5...):
 
  每次新数据都在最后一页后面追加 → 新开一页就完事
 
  像在笔记本最后一页后面贴便利贴,很简单
 
 
 
用 UUID 主键(如 'a3f2c8b1-...',无规律):
 
  新数据的主键可能比已有的小 → 要插到中间 → 已有的页要分裂
 
  像在写满的笔记本第 52 页突然要插一页 → 需要把后面所有页往后挪
 

页分裂很昂贵,涉及数据搬迁、磁盘随机写。自增主键能尽量避免。


速记卡(面试闪卡)

Q1:一句话讲清「自增主键推荐原因」到底是什么?

A:自增主键让新数据有序追加在 B+树末页,避免昂贵的页分裂。

Q2:一、B+树叶子按主键顺序排页 —— 怎么理解?

A:InnoDB 的 B+树叶子节点按主键从小到大一页页往后排。比喻:像在笔记本最后一页后面贴便利贴,按顺序往上贴很简单。主键就是页码,决定新数据落在哪一页。英文:B+Tree(B+树)、聚簇索引。

Q3:二、为什么自增主键最省心 —— 怎么理解?

A:自增 id=1,2,3… 每次新数据都追加在最后一页后面,新开一页就完事。比喻:便利贴永远贴在本子末尾,不用动前面任何一页。写入是纯顺序 IO,最快最省。英文:auto-increment(自增)、sequential write(顺序写)。

Q4:三、UUID 主键为何引发页分裂 —— 怎么理解?

A:UUID 主键无序(如 ‘a3f2c8b1…’),新数据主键可能比已有的小,要插到中间页。比喻:在写满的笔记本第 52 页突然插一页,得把后面所有页往后挪。这就是页分裂,极昂贵。英文:page split(页分裂)、random insert(随机插入)。

Q5:四、页分裂为什么昂贵 —— 怎么理解?

A:页分裂涉及数据搬迁、磁盘随机写,还可能在并发下触发锁竞争。自增主键几乎能完全避免它,所以”能用自增就用自增”。只有分布式必须全局唯一时才忍痛用 UUID,并配合雪花算法降低离散度。英文:page split cost(页分裂代价)。

Q6:核心速记主线有哪些?

  • 主键=页码,决定数据落在 B+树哪一页

  • 自增主键:顺序追加末页,纯顺序 IO

  • UUID:无序插入中间页,触发页分裂

  • 页分裂昂贵(搬迁+随机写),自增可避免

口诀

A:自增主键顺序写,新数据往末页叠;

UUID 乱插中间页,页分裂性能必歇。

B+树按主键排页,便利贴往后贴;

能用自增就自增,页分裂最费鞋。

相关链接