MySQL 三星索引

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值