有两个高频查询:
SELECT * FROM XXX WHERE B = 200 AND C > 100
SELECT * FROM XXX WHERE A = 300 AND B = 200 AND C > 100
大量执行,问怎么设计联合索引?
联合索引设计建议:
基于数据库索引的最左前缀匹配原则,为了同时高效支持这两个查询,推荐的联合索引顺序是:
(B, C, A)。设计理由如下:
- 覆盖第一个查询 (
B=200 AND C>100): - 索引
(B, C, A)的前两列B和C正好完全匹配了第一个查询的WHERE条件。由于B是等值查询,C是范围查询,该索引可以有效用于快速定位到B=200且C>100的数据行。
- 覆盖第二个查询 (
A=300 AND B=200 AND C>100): - 虽然查询条件顺序是
A, B, C,但数据库优化器通常可以进行调整以利用索引。 - 索引
(B, C, A)依然可以高效工作: - 首先通过
B=200(等值)快速过滤。 - 然后在
B=200的结果集中,利用C>100(范围)进行第二级过滤。 - 对于
A=300这个条件,由于它位于索引的最后,并且在B和C的条件已经大幅筛选后,数据库可以通过索引下推(Index Condition Pushdown, ICP)等优化技术,在索引层面就过滤掉不符合A=300的行,避免回表查询无效数据。
为什么不建议
(A, B, C)?如果将索引设计为
(A, B, C),那么对于第一个查询(没有A条件),由于不满足最左前缀原则(缺少A列),数据库将无法有效使用这个索引,可能导致全表扫描,性能低下。总结:
因此,对于这个场景,创建
(B, C, A)的联合索引是最佳选择,因为它能以最小的索引数量,同时最优地支持这两个高频查询。





Loading Comments...