共计 1714 个字符,预计需要花费 5 分钟才能阅读完成。
本篇内容介绍了“mysql 中 filesort 指的是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在 mysql 中,filesort 是指文件排序,是通过相应的排序算法,将取得的数据在内存中进行排序。filesort 分两种:1、双路排序,是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行指针信息,然后在 sort buffer 中进行排序;2、单路排序,是一次性取出满足条件行的所有字段,然后在 sort buffer 中进行排序。
在 MySQL 中的 ORDER BY 有两种排序实现方式:
1. 利用有序索引获取有序数据
2. 文件排序(filesort)
在 explain 中分析查询的时候,利用有序索引获取有序数据显示 Using index,文件排序显示 Using filesort。
只有当 ORDER BY 中所有的列必须包含在相同的索引,并且索引的顺序和 order by 子句中的顺序完全一致,并且所有列的排序方向(升序或者降序)一样才有,(混合使用 ASC 模式和 DESC 模式则不使用索引)
where 语句 与 order by 语句组合满足最左前缀
在其他的情况下 使用 文件排序如下:
1)where 语句与 order by 语句,使用了不同的索引
2)检查的行数过多,且没有使用覆盖索引
3)ORDER BY 中的列不包含在相同的索引,也就是使用了不同的索引
4)对索引列同时使用了 ASC 和 DESC
5)where 语句或者 ORDER BY 语句中索引列使用了表达式,包括函数表达式
6)where 语句与 ORDER BY 语句组合满足最左前缀,但 where 语句中查找的是范围。
filesort
这个 filesort 并不是说通过磁盘文件进行排序,而只是告诉我们进行了一个排序操作。即在 MySQL Query Optimizer 所给出的执行计划 (通过 EXPLAIN 命令查看) 中被称为文件排序(filesort)
文件排序是通过相应的排序算法, 将取得的数据在内存中进行排序: MySQL 需要将数据在内存中进行排序,所使用的内存区域也就是我们通过 sort_buffer_size 系统变量所设置的排序区。这个排序区是每个 Thread 独享的,所以说可能在同一时刻在 MySQL 中可能存在多个 sort buffer 内存区域。
filesort 分两种
双路排序:是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行指针信息,然后在 sort buffer 中进行排序。排序后再吧查询字段依照行指针取出,共执行两次磁盘 io。
单路排序:是一次性取出满足条件行的所有字段,然后在 sort buffer 中进行排序。执行一次磁盘 io。
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 参数值之后,系统负载马上得到了大的缓解,响应也快了很多。
如果 order by 的子句只引用了联接中的第一个表,MySQL 会先对第一个表进行排序,然后进行联接。也就是 expain 中的 Extra 的 Using Filesort. 否则 MySQL 先把结果保存到临时表(Temporary Table), 然后再对临时表的数据进行排序. 此时 expain 中的 Extra 的显示 Using temporary Using Filesort.
“mysql 中 filesort 指的是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!