select * from order where status = 1 order by create_time asc
先来看上面这条sql,为了最优化性能,最好的办法是建立联合索引(status, create_time),这样在status相同的情况下,create_time默认就是升序的,如果只建立了status索引,就需要把所有status=1的数据读取到sort buffer排好序再返回给执行器,如果缓冲区能容纳下还好说,容纳不下还需要外部排序,把文件分成很多小块,使用归并排序,很浪费时间。
容纳下的话用两种方式:单路排序和双路排序,单路就是需要的字段和排序的字段,排好序不需要回表,缺点是占用内存多,sortbuffer可能装不下。双路就是只要主键ID和排序字段,优点与单路排序相反。