来源:markus-winand · 原文
为什么这是全书主体
作者把 where 子句视为索引最核心的应用场景,因为索引的根本功能就是快速筛选。查询慢,很多时候不是没建索引,而是 where 写法让索引只能大范围扫描。
这一章的主线
- 等值查询:多列索引里通常先放等值条件;
- 范围查询:一旦进入范围,后续列对访问路径的帮助会明显减弱;
LIKE查询:只有第一个通配符之前的前缀能真正参与索引访问;- 函数与表达式:会遮蔽原始列,让索引失效或退化成过滤;
- 绑定参数:默认应该使用,但要知道它会让优化器看不见具体值分布;
- 部分索引:对固定常量条件反复出现的查询,可以只索引满足条件的那部分行。
最实用的几条原则
- 等值优先、范围其次;
- 不要把列藏进函数、拼接、数学表达式或隐式类型转换里;
- 结果集小不等于扫描范围小;
- 前导通配符不是 B-tree 擅长的问题。
常见反模式
作者集中批评了一类“聪明但慢”的写法:
- 拼接列后再搜索;
- 用字符串存数字;
- 把日期条件写成函数包裹列的形式;
- 用复杂逻辑分支让优化器看不清真正意图。
这些写法共同的问题是:数据库很难从表达式中直接推出索引访问边界。
相关页面:use-the-index-luke · query-shape-and-index-usage · sql-indexing · sql-execution-plans