MySQL order by 排序的两种方式以及排序原理
MySQl innodb引擎支持创建索引(主键 唯一 联合等)。
在实际的开发过程中,使用最多的还是联合索引,使用联合索引必须遵从最左前缀原则,比如,索引结构是 name_age_position。
1.在where条件中 如果使用到这三个字段作为条件,如where name=? and age=? and posision=? ;最好是按照索引创建的先后顺序,虽然 where age=? and name=? and posision=? 这样也会走name_age_position索引,但是,MySQL优化器需要耗时去把sql优化成where name=? and age=? and posision=? 这样的格式来执行,浪费时间,这是不必要的
2.查询尽可能多的让条件走name_age_position索引,比如 where name=? and age>?and posision=? 这样的查询 只会用到name和age索引,不会使用posision索引
3.order by,如果where和order by 子句能满足索引最左前缀法则,那么会使用索引排序,效率高 比如 where name=? order by age ,posision 注意 order by posision,age 将不会走索引排序,这种排序方式称之为 using index sort,
如果order by 不使用索引排序,name将会使用文件排序(file sort),效率低。文件排序有两种方式:
单路排序:一次性取出所有满足条件行的数据,然后再sort buffer中进行排序,然后返回结果集给客户端
多路排序(回表排序):根据where条件和排序字段定位到满足条件的行数据,取出数据行的id和排序字段到sort buffer中排序,然后根据排好序的id回表查询其他所需要的字段数据
sort buffer的大小默认是1M 可以修改 max_length_for_sort_buffer=1024(默认)的值控制sort buffer的大小 不推荐修改