来源:markus-winand · 原文
这一章对整套索引主题来说几乎就是地基。很多后面看起来像经验法则的判断,只要回到这里,就会重新变成很朴素的物理事实。
章节范围
这一部分覆盖索引结构、叶子节点、B-tree 平衡树,以及“慢索引”的真正来源,是理解整本书的物理基础。我很喜欢它的地方在于,它没有把索引讲成一个神奇黑箱,而是讲成了一个你能在脑子里真正运行起来的结构。
关键模型
这组章节把索引拆成两个结构:
- 平衡树:快速定位到扫描起点;
- 叶子节点双向链表:按序继续读取后续索引项。
索引因此不是一张静态排序表,而是一个既支持查找、又支持持续插入更新的动态有序结构。
为什么索引会慢
作者把一次索引访问分成三步:
- 树遍历:找到起始叶子节点;
- 叶子链扫描:沿链表读取所有匹配项;
- 回表:根据
ROWID/RID取回完整行。
真正容易失控的是后两步,而不是树遍历本身。因此“索引变坏了”往往是误诊,真正的问题通常是扫描范围太大或回表太多。
这一章给后文的支点
后面关于 where、排序、分页、连接和覆盖索引的几乎所有判断,都能回到这里:好的索引设计,本质上就是缩短叶子扫描并尽量减少回表。 这也是为什么我会把这页当作整条 SQL 主线里最值得反复回看的基础页之一。
相关页面:use-the-index-luke · b-tree-indexes · sql-indexing · sql-execution-plans