order by排序时字段顺序和联合索引顺序不一致时为什么仍能使用到索引

详细问题:

age和phone建立idx_user_age_phone联合索引,为什么order by排序phone,age的时候会出现using index,索引的顺序不是先agephone吗,为什么排序phone的时候能用到索引的顺序,此时索引里面的顺序不是和需要order by 的顺序不一样吗?

解答:

        查看语句的explain执行计划确实发现using index。根据最左前缀法则,我们不难发现此时对于phone的排序是用到联合索引的。(补充说明:Using filesortUsing index
区别:前者需要在排序缓冲区完成排序操作,后者通过有序索引扫描直接返回有序顺序,操作效率更高)

        这是因为索引的顺序本身并不会限制查询的方式。虽然联合索引的顺序是(age, phone),但对于ORDER BY phone, age的查询,MySQL 可以根据索引中的phone来优化排序操作。当查询按照phone排序时,MySQL可以直接使用索引的顺序,而不需要访问表的实际数据。然后,对于相同的phone值,MySQL可以进一步根据age来排序,这一步便需要在排序缓冲区完成。

        简单来讲,就是create index  idx_user_age_phone的时候,索引便存储了两种排序的数据,一种是age,phone,另外一种则是和phone单列索引一样的顺序。

        总结起来,索引的有序性可以提供部分排序优化,但并不一定能够涵盖所有的排序需求。对于不符合索引顺序的排序操作,MySQL还是需要在排序缓冲区进行最终的排序操作,以满足完整的排序要求。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值