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 数据行数;数据量决定排序算法 当数据量较小时使用双路排序,较大时使用单路排序
posted @ 2022-05-27 11:30  SArtOnline  阅读(159)  评论(0编辑  收藏  举报