🖇️

联合索引设计题

有两个高频查询:
  1. SELECT * FROM XXX WHERE B = 200 AND C > 100
  1. SELECT * FROM XXX WHERE A = 300 AND B = 200 AND C > 100
大量执行,问怎么设计联合索引?
 

联合索引设计建议:

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

Loading Comments...