全字段排序

  • sort buffer

    • explain分析sql,会发现Extra字段中有“Using filesort”,表示的就是需要排序,MySQL会给每个线程分配一块内存用于 排序,称为sort_buffer

      1. select city,name,age from t where city='杭州' order by name limit 1000 ;
    • 执行流程(city上有索引)

      • 初始化sort_buffer,确定放入name、city、age这三个字段;
      • 从索引city找到第一个满足city=’杭州’条件的主键id
      • 到主键id索引取出整行,取name、city、age三个字段的值,存入sort_buffer中
      • 从索引city取下一个记录的主键id;
      • 重复上面两个步骤,直到city的值不满足查询条件为止
      • 对sort_buffer中的数据按照字段name做快速排序
      • 按照排序结果取前1000行返回给客户端
    • 如果要排序的数据量 小于sort_buffer_size,排序就在内存中完成。但如果排序数据量太大,内存放不下,则不得不 利用磁盘临时文件辅助排序。
      • 外部排序会使用多个文件,使用归并排序算法
    • 参数max_length_for_sort_data
      • 如果读取的字段总长度大于这个参数,那么每次读取参与排序字段到sort_buffer中
      • 最后返回结果前,再从原表读取剩余字段
    • 如果city 和 name字段创建了联合索引,索引数据本身就是有序的
      • 条件判断字段要在排序字段前
      • Extra:Using index condition
    • 使用覆盖索引,可以进一步提升查询性能
      • Extra:Using index

        内存临时表

  • 例如:

    select word from words order by rand() limit3;
    
    • Extra内容:Using temporary;Using filesort,表示需要使用临时表、需要排序操作