一、order by
针对联合索引:
mysql中InnoDB排序一般有两种排序方式,Using index和Using filesort。一个锁索引排序,效率高。一个是文件排序,效率低。
1.order by语句使用最左前列。
2.where子句和order by字句组合使用最左前列
3.能使用覆盖索引尽量使用覆盖索引
4.group by 和order by很类似,实质是先排序后分组,如果不想排序,可以order by null禁止排序。
针对Using filesort有两种排序方式:
单路排序:根据条件把需要的字段全局查询出来,加载到sortbuffer中,然后根据排序字段进行排序,最后直接从内存中把排好序的结果返回去。
双路排序(回表排序):根据条件把记录id,排序字段加载到sort buffer中,然后根据排序字段进行排序,在根据id回表查询,在把结构返回。
是选择单路排序还是双路排序,mysql根据系统变量max_length_for_sort_data(1024kb)比对,如果查询的字段总长度超过这个值,则选择双路排序,如果小于这个值 则选择单路排序。这个变量是可以修改的(当然不见修改)。
对比两种排序方式:
1.单路排序占用的内存空间较大,但是速度很快。
<