自增主键推荐原因
一、为什么推荐自增主键?
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+树按主键排页,便利贴往后贴;
能用自增就自增,页分裂最费鞋。