跳转至

select from table where a=1 and b2 order by c,d,f 怎么加索引?

典型回答

这是一个典型的索引相关的问题,这个问题其实不算难。

这个SQL中可能和索引有关的内容有以下三个方面:

  • where a = 1 and b >2a = 1是等值匹配(高效),b > 2是范围匹配(次高效)。可以建立(a,b)联合索引,并且把a放前面。
  • order by c,d,f: 排序字段是 (c, d, f),如果能被索引覆盖,就能避免 filesort。 (因为索引天然有序)
  • select * : 查询所有字段,索引无法完全覆盖查询,仍需回表读取数据。

综上所述,建索引肯定是有必要的。

建议建立如下索引:

CREATE INDEX idx_a_b_c_d_f ON table(a, b, c, d, f);
  • a 在最前面,因为是等值匹配;
  • b 在第二个位置,因为它是范围过滤;即使 b 是范围条件,MySQL 仍可利用 (a,b) 部分来过滤;
  • (c,d,f) 排序部分在某些情况下仍能部分利用索引顺序(取决于优化器和数据分布)

不过需要注意,如果 b > 2 的选择性很差(即很多行符合条件),MySQL 可能仍需 filesort;可以考虑不要b或者把他放到最后去。

CREATE INDEX idx_a_c_d_f ON table(a, c, d, f, b);

CREATE INDEX idx_a_c_d_f ON table(a, c, d, f);