来源:markus-winand · 原文

这一章很像整套索引材料里一个特别容易被低估的转折点。很多人理解了“怎么找到命中的索引项”,却还没真正理解“为什么找到之后还是慢”;而这章几乎就是在回答后一个问题。

第二种索引力量

这一章把“聚簇”称为索引的第二种力量。它关注的不是如何更快找到第一条命中记录,而是如何让接下来要访问的多条记录尽量落在相近的数据块里,从而减少回表 IO。

关键概念

  • clustering factor:索引顺序与表中物理顺序的贴近程度;
  • index-only scan:索引本身就包含查询所需列,于是完全不回表;
  • clustered / index-organized table:把表直接按索引结构组织。

这一章最有价值的判断

很多查询之所以慢,不是因为找不到正确索引项,而是因为找到了太多分散的 ROWID,必须去不同数据块里一条条拿完整行。改善这件事,要么让数据更聚簇,要么让索引覆盖更多查询所需列。

代价也很真实

覆盖索引和聚簇优化都不是免费午餐:索引会更大、维护更重、设计更激进,所以更适合用于高频关键查询,而不是到处盲目铺开。我很喜欢这一章的地方就在于,它既讲清了为什么会快,也没有把代价藏起来。


相关页面:use-the-index-luke · b-tree-indexes · sql-indexing · index-maintenance-tradeoffs