mysql file sort
,利用有序索引获取有序数据显示Using index。而文件排序显示Using filesort。
Using index。而文件排序显示Using filesort。
注意:MySQL在查询时最多只能使用一个索引。因此,如果WHERE条件已经占用了索引,那么在排序中就不使用索引了。
1) 返回选择的字段,即只包括在有选择的此列上(),不一定适应*的情况):
| table | | possible_keys | | key_len | | rows | |
| test | | rdate || 8 | | 10 | |
| table | | possible_keys | | key_len| | rows | |
| test | | rdate | | NULL | | 13 ||
2) 只有当ORDER BY中所有的列必须包含在相同的索引,并且索引的顺序和order by子句中的顺序完全一致,并且所有列的排序方向(升序或者降序)一样才有,(混合使用ASC模式和DESC模式则不使用索引)
| table | | possible_keys | key | key_len | ref | rows | Extra |
| test | i | NULL | rdate |16 | NULL | 13 |Using index|
Using where;
3) where 语句与ORDER BY语句组合满足最左前缀:
|
4) 如果查询联接了多个表,只有在order by子句的所有列引用的是第一个表的列才可以。
order by inventid;
Usingfilesort|
sort_buffer_size 系统变量所设置的排序区。这个排序区是每个Thread 独享的,所以说可能在同一时刻在MySQL 中可能存在多个 sort buffer 内存区域。
双路排序:是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行指针信息,然后在sort buffer 中进行排序。
单路排序:是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序。
主要目的是为了减少第一次算法中需要两次访问表数据的 IO 操作,将两次变成了一次,但相应也会耗用更多的sortbuffer 空间。当然,MySQL4.1开始的以后所有版本同时也支持第一种算法,
MySQL主要通过比较我们所设定的系统参数 max_length_for_sort_data的大小和Query 语句所取出的字段类型大小总和来判定需要使用哪一种排序算法。如果 max_length_for_sort_data更大,则使用第二种优化后的算法,反之使用第一种算法。所以如果希望 ORDER BY 操作的效率尽可能的高,一定要主义max_length_for_sort_data 参数的设置。曾经就有同事的数据库出现大量的排序等待,造成系统负载很高,而且响应时间变得很长,最后查出正是因为MySQL 使用了传统的第一种排序算法而导致,在加大了max_length_for_sort_data 参数值之后,系统负载马上得到了大的缓解,响应也快了很多。
1. 加大 max_length_for_sort_data 参数的设置
2. 去掉不必要的返回字段
3. 增大 sort_buffer_size 参数设置