MySQL优化之单路排序(多路排序)
一、应用场景
- SQL未命中索引时,filesort所使用的算法
二、产生原因
-
filesort:当SQL含有order等排序执行,并且字段不命中索引;此时SQL执行文件排序”filesort“
-
排序算法:4.1以前双路排序、4.1之后单路排序
-
双路排序:两次磁盘;取order字段和数据指针进内存,排序完成后回表查询其他数据
-
单路排序:一次磁盘;取order字段和其他所有字段进内存,排序完后直接返回
-
内存限制:sort_buffer_size每个进程内存缓冲区、max_length_for_sort_data每个执行缓存数据量
-
三、解决方案
-
案例
# 表为 INSERT INTO TABLE A (F_ID,F_ID2,F_NAME) values(1,1,'NAME'); # 假如列F_ID为主键索引,F_ID2为二级索引 select F_ID2,F_NAME from A order by F_ID2; ## 双路排序:第一次读取磁盘F_ID2和隐藏行指针排序,然后回表查询磁盘对应F_NAME ## 单路排序:第一次读取磁盘F_ID2和F_NAME排序,然后直接返回结果
四、参数
参数 | 作用和优点 | 缺点 |
---|---|---|
sort_buffer_size | 存放待排序数据:数据量小于缓冲区时,内存排序 | 当数据量大于缓冲区,则进行普通磁盘排序 |
max_length_for_sort_data | 数据行数;数据量决定排序算法 | 当数据量较小时使用双路排序,较大时使用单路排序 |
本文来自博客园,作者:SArtOnline,转载请注明原文链接:https://www.cnblogs.com/sartonline/p/16316970.html