MySQL 三星索引

    xiaoxiao2023-09-27  28

    表: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而言,时间太长) 所以对于结果集很大,但只需要产生一屏数据,排序消耗的时间太长,要考虑避免排序

    最新回复(0)