概览
“给 WHERE 条件中的字段建索引”并不是可靠的索引优化方法。 一个有效索引通常需要同时考虑:- 哪些条件具有较高过滤能力
- 哪些字段用于 Join
- 哪些字段适合作为联合索引 leading columns
- 是否可以覆盖排序或分组
- 是否已存在等价或重复索引
- 新索引是否会真正改变执行计划
核心能力
谓词驱动的候选生成
分析 WHERE 条件中的等值、范围、IN、LIKE 等谓词,识别可能适合作为索引列的字段。感知 Join 的索引
分析 Join 条件,识别连接键上的索引机会。 对于频繁 Join 的业务表,这通常比单纯分析 WHERE 条件更重要。复合索引设计
在多个索引列之间分析顺序,并结合:- 选择性
- 等值与范围谓词
- Join 条件
- ORDER BY
- GROUP BY
存量索引分析
推荐新索引之前,应检查现有索引,避免:- 重复索引
- 前缀重复索引
- 功能高度重叠的索引
- 不必要的索引膨胀
数据库感知的索引语法
不同数据库的索引能力差异较大。 PawSQL 可根据目标数据库考虑:- B-tree / bitmap 等索引类型
- INCLUDE / covering index
- local / global index
- concurrently / online
- 分区表索引
- 分布式数据库索引限制
索引有效性验证
智能索引推荐的最终目标不是“生成 CREATE INDEX”,而是确认:新索引是否真的能改变执行路径,并降低 SQL 成本。
示例
原始 SQL:customer_id用于等值过滤order_date用于范围过滤order_date同时参与排序
推荐 → 模拟 → 验证
PawSQL 的索引优化理念可以概括为: 如果目标数据库支持虚拟索引、Hypothetical Index 或类似机制,推荐结果可以在不立即创建真实索引的情况下进行执行计划验证。PawSQL 会避免什么
一个好的智能索引推荐系统不仅需要知道“应该加什么索引”,也需要知道“不应该加什么索引”。 例如:- 对低选择性字段机械建索引
- 为每条 SQL 单独创建大量相似索引
- 忽略已有联合索引
- 只优化查询而忽略写入成本
- 创建不会改变执行计划的索引