zoukankan      html  css  js  c++  java
  • MySQL中的两种排序方式: index和filesort

    index :通过有序索引顺序扫描直接返回有序数据,不需要额外的排序,操作效率较高。

    filesort:通过对返回数据进行排序,filesort 并不代表通过磁盘文件排序,而是说明进行了一个排序操作,至于排序操作是否使用了磁盘文件或临时表等,则取决于MySQL服务器对排序参数的设置和需要排序数据的大小。

    一般而言,filesort是通过相应的排序算法,将所取得的数据在sort_buffer_size系统变量设置的内存排序区中进行排序,如果内存装载不下,它就会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集。

    sort_buffer_size设置的排序区是每个线程独占的,所以同一时刻,MySQL中存在多个sort buffer排序区。

    优化:尽量减少额外排序,通过索引直接返回有序的数据。where 条件和order by 使用了相同的索引,并且order by 的顺序和索引顺序相同,并且order by 的字段都是升序或者降序,否则肯定需要额外的排序操作,这样就会出现 filesort。

    以下SQL可以使用索引:

    select * from tablename order by key_part1,key_part2,....;

    select * from tablename where key_part1=1 order by key_part1 desc,key_part2 desc;

    select * from tablename order by key_part1 desc,key_part2 desc;

    以下SQL不可以使用索引:

    select * from tablename order by key_part1 desc,key_part2 asc;  ----order by 的字段混合asc,desc

    select * from tablename where key2=constant order by key1;  ----用于查询的关键字与order by 中所使用的不相同

    select * from tablename order by key1,key2;     ----对不同的关键字使用order by

    对于Filesort,MySQL有两种排序算法 :

    一次扫描算法和两次扫描算法,通过比较系统变量max_length_for_sort_data的大小和query语句总字段的大小来判断使用哪种排序算法。

    适当增加 max_length_for_sort_data的值,适当增加sort_buffer_size排序区,尽量使用具体的字段而不是select * 选择所有字段。

    在CPU和IO之间平衡。

     

  • 相关阅读:
    刷题-力扣-541. 反转字符串 II
    刷题-力扣-515. 在每个树行中找最大值
    刷题-力扣-513. 找树左下角的值
    刷题-力扣-404. 左叶子之和
    刷题-力扣-257. 二叉树的所有路径
    刷题-力扣-226. 翻转二叉树
    刷题-力扣-236. 二叉树的最近公共祖先
    刷题-力扣-235. 二叉搜索树的最近公共祖先
    刷题-力扣-145. 二叉树的后序遍历
    扛把子组2018092609-2 选题 Scrum立会报告+燃尽图 06
  • 原文地址:https://www.cnblogs.com/kate7/p/13447000.html
Copyright © 2011-2022 走看看