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之间平衡。

     

  • 相关阅读:
    wikioi 1514 and ZJOI2006 书架
    HDU 4762 Cut the Cake(公式)
    HDU 4762 Cut the Cake(公式)
    呵呵,cnblog排名进4000了,留念一下!
    呵呵,cnblog排名进4000了,留念一下!
    电子书下载:C# Database Basics
    电子书下载:C# Database Basics
    (原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (Nios II) (SOPC Builder) (DE2-70)
    (原創) 如何在Nios II顯示8位數的七段顯示器? (SOC) (Nios II) (SOPC Builder) (DE2-70)
    部署GlusterFS及Heketi
  • 原文地址:https://www.cnblogs.com/kate7/p/13447000.html
Copyright © 2011-2022 走看看