表:TEST
列:A,B,C,D,E,F
索引:idx_a_b_c(A,B,C)
A列:过滤因子1%
B列:过滤因子10%
第一颗星,保证最窄的索引片
SELECT A,B,C,D,E,F FROM TEST WHERE A=A1 AND B=B1 AND C = C1
索引idx_a_b_C 满足了所有的谓词
WHERE A=A1 AND B=B1 AND C=C1
idx_a_b_c 为一星索引,但D,E,F 需要回表查找,所以无法满足三星
第二颗星,避免排序
SELECT A,B,C,D,E,F FROM TEST WHERE A=A1 AND B=B1 ORDER BY C DESC
OR
SELECT A,B,C,D,E,F FROM TEST ORDER BY A DESC
索引idx_a_b_c 可以用于排序,索引符合二星,但需要回表,无法满足三星
第三颗星,避免回表,同时满足一星,二星
SELECT A,B,C FROM TEST WHERE A=A1 AND B>B1
idx_a_b_c 可以直接从索引值获取A,B,C的值,不需要回表,同时 满足第一颗星
宽索引:避免了回表,的可能不满足第一颗星
SELECT A,B,C FROM TEST WHERE A>1 AND B=B1 AND C=C1
A 是范围查找,B,C索引不在匹配,但是,所有的值可以通过 idx_a_b_c 获取,而不需要回表查找
总结
一般而言,如果一和二无法同时实现, 一比二更重要。
更窄的索引片,能减少随机访问,而且小数据,在CPU排序,速度是非常快的。
假设每一行处理速度是10us左右 5W行排序 只需要0.5s(当然对于CPU而言,时间太长)
所以对于结果集很大,但只需要产生一屏数据,排序消耗的时间太长,要考虑避免排序