在sql语句中,对查询结果进行排序是非常常见的需求,一般情况下我们用关键字:order by
就能搞定。
但我始终觉得order by挺难用的,它跟where
或者limit
关键字有很多千丝万缕的联系,一不小心就会出问题。
首先当然要温柔一点,一起看看order by的哪些情况可以走索引。
我之前说过,在code、age和name这3个字段上,已经建了联合索引:idx_code_age_name。
order by后面的条件,也要遵循联合索引的最左匹配原则。具体有以下sql:
explain select * from user
order by code limit 100;
explain select * from user
order by code,age limit 100;
explain select * from user
order by code,age,name limit 100;
执行结果:
从图中看出这3条sql都能够正常走索引。
除了遵循最左匹配原则之外,有个非常关键的地方是,后面还是加了limit
关键字,如果不加它,索引会失效。
order by还能配合where一起遵循最左匹配原则。
explain select * from user
where code='101'
order by age;
执行结果:
code是联合索引的第一个字段,在where中使用了,而age是联合索引的第二个字段,在order by中接着使用。