美文网首页
order by优化,避免filesort

order by优化,避免filesort

作者: 撸完代码送快递 | 来源:发表于2020-04-05 15:52 被阅读0次

filesort

当我们在MySQL执行计划中,遇到了Using filesort,这就证明MySQL在执行这条语句的时候用到了filesort,而没有使用我们的索引进行排序。所以就需要进行优化。
具体filesort的过程如下:
1、根据表的索引或者全表扫描,读取所有满足条件的记录。
2、对与每一行,存储一对值到缓冲区(排序列,行记录指针),一个是排序的索引列的值,即order by用到的列值,和指向该行数据的行指针,缓冲区的大小为sort_buffer_size大小。
3、当缓冲区满后,运行一个快速排序(qsort)来将缓冲区中数据排序,并将排序完的数据存储到一个临时文件,并保存一个存储块的指针,当然如果缓冲区不满,则不会重建临时文件了。
4、重复以上步骤,直到将所有行读完,并建立相应的有序的临时文件。
5、对块级进行排序,这个类似与归并排序算法,只通过两个临时文件的指针来不断交换数据,最终达到两个文件,都是有序的。
6、重复5直到所有的数据都排序完毕。
7、采取顺序读的方式,将每行数据读入内存,并取出数据传到客户端,这里读取数据时并不是一行一行读,读如缓存大小由read_rnd_buffer_size来指定。

优化使用索引排序

我们的目标就是优化为Using index
官网文档里边有很多优化的方法,这里就只列举其中讲到的几点。
1.select字段中只包含索引字段,避免包含无关字段。

SELECT pk, key_part1, key_part2 FROM t1
  ORDER BY key_part1, key_part2;

这样避免了filesort,pk是主键,这个也是可以通过索引查询到了。如果使用*的话,涉及到了回表,这样操作,还不如直接进行filesort。不管怎样,我们日常开发过程中,都应该避免使用*。
2.使用constant查询联合order by

SELECT * FROM t1
  WHERE key_part1 = constant
  ORDER BY key_part2;

使用了constant查询后,之后对索引进行order by,这样做后大几率会比全表查询效率要好!
3.避免order by条件中一个desc 一个 asc

还有更多细节可以参考官方文档

还有很多原则,总之最主要的就是我们的MySQL innodby引擎使用的是B+树结构存储数据,我们要做的就是尽可能的让我们查询的字段只存在于索引树中;或者通过索引,我们能够有效的过滤出我们需要的数据id,然后回表。

https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html
https://www.cnblogs.com/aeolian/p/10212892.html

相关文章

  • Mysql高级(六) Order By 与 Group By

    一、Order By 优化 尽量使用index方式排序,避免使用filesort方式排序 1.1 Order By...

  • mysql调优之索引——ORDER BY(GROUP BY)

    order by的排序优化 1、ORDER BY 子句尽量使用index方式排序,避免使用filesort方式排序...

  • order by优化,避免filesort

    filesort 当我们在MySQL执行计划中,遇到了Using filesort,这就证明MySQL在执行这条语...

  • order by 关键字的排序优化

    ORDER BY 子句,尽量使用index方式排序,避免使用FileSort方式排序。 建表 插入数据 创建索引 ...

  • 数据库索引优化案例

    order by不要用filesort,建立索引,将order放在最右边,就是排序好的。表查询语句及其explai...

  • 七、Mysql优化

    groupBy优化——filesort 联表优化——NLJ和BNL 索引查询优化——ICP

  • 1 SQL查询优化

    SQL语句优化 对查询进行优化,要尽量避免全表扫描。在 where 或 order by 的列上加索引。 尽量避免...

  • mysql之order by

    order by就是排序。 --排序查询Extra 这个字段中的“Using filesort”表示的就是需要排序...

  • sql优化3

    Select语句优化: 尽量避免全表扫描, where 及 order by 涉及的列上考虑建立索引 避免在SQL...

  • sql语句优化

    避免全表扫描的sql优化 对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列...

网友评论

      本文标题:order by优化,避免filesort

      本文链接:https://www.haomeiwen.com/subject/lpmuphtx.html