order by : 将sql查询出的结果依据某些条件进行排序。
在sql中使用order by,常会出现using filesort。
数据库中的数据最终都是保存在磁盘中的。依据IO的次数,using filesort有两种算法,单路排序和双路排序。
MySQL4.1之前 默认使用 双路排序;双路:扫描2次磁盘(1:从磁盘读取排序字段 ,对排序字段进行排序(在buffer中进行的排序) 2:扫描其他字段 )
但是IO本身比较消耗性能。
MySQL4.1之后 默认使用 单路排序 : 只读取一次(全部字段),在buffer中进行排序。但种单路排序 会有一定的隐患 (不一定真的是“单路|1次IO”,有可能多次IO)。原因:如果数据量特别大,则无法 将所有字段的数据 一次性读取完毕,因此 会进行“分片读取,即多次读取”。
注意:单路排序 比双路排序 会占用更多的buffer,因为单路排序将所有需要的字段都扫描出来了。
单路排序时,如果数据量大,可以考虑调整buffer的容量大小,set max_length_for_sort_data = 1024 单位byte
如果max_length_for_sort_data值太低,则mysql会自动从 单路->双路(太低:需要排序的列的总大小超过了max_length_for_sort_data定义的字节数)
提高order by查询的策略:
a.选择使用单路、双路 ;调整buffer的容量大小;
b.避免select * …
c.复合索引 不要跨列使用 ,避免using filesort
d.保证全部的排序字段 排序的一致性(都是升序 或 降序)
sql中的order by
最新推荐文章于 2023-10-23 18:39:42 发布