select from table where a=1 and b2 order by c,d,f 怎么加索引?¶
典型回答¶
这是一个典型的索引相关的问题,这个问题其实不算难。
这个SQL中可能和索引有关的内容有以下三个方面:
- where a = 1 and b >2:
a = 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);