详细问题:
给age和phone建立idx_user_age_phone联合索引,为什么order by排序phone,age的时候会出现using index,索引的顺序不是先age后phone吗,为什么排序phone的时候能用到索引的顺序,此时索引里面的顺序不是和需要order by 的顺序不一样吗?
解答:
查看语句的explain执行计划确实发现using index。根据最左前缀法则,我们不难发现此时对于phone的排序是用到联合索引的。(补充说明:Using filesort和Using index
区别:前者需要在排序缓冲区完成排序操作,后者通过有序索引扫描直接返回有序顺序,操作效率更高)
这是因为索引的顺序本身并不会限制查询的方式。虽然联合索引的顺序是(age, phone)
,但对于ORDER BY phone, age
的查询,MySQL 可以根据索引中的phone
来优化排序操作。当查询按照phone
排序时,MySQL可以直接使用索引的顺序,而不需要访问表的实际数据。然后,对于相同的phone
值,MySQL可以进一步根据age
来排序,这一步便需要在排序缓冲区完成。
简单来讲,就是create index idx_user_age_phone的时候,索引便存储了两种排序的数据,一种是age,phone,另外一种则是和phone单列索引一样的顺序。
总结起来,索引的有序性可以提供部分排序优化,但并不一定能够涵盖所有的排序需求。对于不符合索引顺序的排序操作,MySQL还是需要在排序缓冲区进行最终的排序操作,以满足完整的排序要求。