MySQL SQL优化:充分理解Using filesort,提升查询性能

举报
赵KK日常技术记录 发表于 2023/06/30 14:56:10 2023/06/30
【摘要】 场景:用户反馈,xx功能生产环境反应过慢,数据最长8秒响应接口定位:无复杂逻辑,定位到具体SQLSQL分析:无索引命中,a表全表扫描Extra Using filesortUsing filesort 是什么意思?官方的定义是,MySQL must do an extra pass to find out how to retrieve the rows in sorted order. T...

场景:用户反馈,xx功能生产环境反应过慢,数据最长8秒响应

接口定位:无复杂逻辑,定位到具体SQL

SQL分析:

image.png

无索引命中,a表全表扫描

Extra Using filesort

Using filesort 是什么意思?

官方的定义是,MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause . The keys then are sorted and the rows are retrieved in sorted order。

MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行。标红,重点。即回表操作。

完整SQL隐藏关键信息

explain select
xx
from
a
left join r on
a.x= r.x
where
xx
xx
xx
xx
xx
order by
a.submitTime desc
limit 0 ,
10
查询a表进行一次回表操作

1强制使用索引

FORCE INDEX (ind_zzz)

没有任何效果

order by 字段建立索引

图片

测试

完成响应 249ms
测试数据命中索引

MySQL是广泛应用于互联网领域的关系型数据库管理系统,SQL语句优化对于提升查询性能至关重要。本文主要讨论MySQL中的Using filesort,介绍其工作原理及影响因素,并提供一些优化策略,以帮助开发者充分理解和正确应用Using filesort,从而提升查询性能。

一、引言

MySQL是一款使用广泛的关系型数据库管理系统,被广泛应用于互联网领域。在大型互联网应用中,高效的SQL查询性能对于系统的稳定性和用户体验至关重要。因此,对于SQL查询的优化和性能提升成为了开发者们需要解决的关键问题。

在MySQL中,Using filesort是一个常见的查询执行计划的操作,它用于对查询结果进行排序。然而,Using filesort的性能开销较大,不当使用可能导致查询性能的下降。因此,充分理解Using filesort的工作原理及优化策略,尤为重要。

二、Using filesort的工作原理

Using filesort主要用于对查询结果进行排序操作。当MySQL优化器决定使用Using filesort时,它会在内存或者磁盘上创建一个临时文件,将查询结果写入该临时文件,并进行排序操作。最后,将排序后的结果返回给用户。

Using filesort的工作原理可以分为以下几个步骤:

  1. 执行查询操作,获取满足查询条件的数据集。
  2. 将数据集按照排序字段进行排序,如果排序字段没有创建索引,则使用全表扫描的方式进行排序操作。
  3. 将排序后的结果返回给用户。

三、影响Using filesort性能的因素

  1. 排序字段的选择
    排序字段在查询中的选择是影响Using filesort性能的重要因素。通常来说,对于没有创建索引的排序字段,在执行排序操作时,MySQL需要使用全表扫描的方式来进行排序,这将导致性能开销较大。因此,如果查询中需要频繁进行排序操作,可以考虑对排序字段进行索引优化。

  2. 数据的分布和排序结果
    数据的分布和排序结果也会影响Using filesort的性能。当排序字段的取值分布较为均匀时,Using filesort会更加高效。而当排序字段的取值分布不均匀时,比如存在大量的重复值或者数据集较大时,Using filesort可能需要更多的内存或者磁盘空间,从而导致性能下降。

  3. 索引的选择
    对于频繁进行排序操作的查询,通过为排序字段创建索引可以提高查询性能。根据实际情况选择合适的索引类型,如B树索引、哈希索引等。对于大数据集或者排序字段取值分布不均匀的情况,使用覆盖索引可以进一步提升查询性能。

  4. 查询优化器的作用
    MySQL的查询优化器扮演着关键的角色,它会根据查询条件和表结构等信息,自动选择最佳的查询执行计划。然而,查询优化器并不总是完美的,它可能会根据不同情况做出不同的选择。因此,了解优化器的工作原理,并手动干预查询执行计划是提升查询性能的重要手段。

四、优化Using filesort的策略

  1. 选择合适的排序字段:对于频繁进行排序操作的查询,要选择合适的排序字段,并为其创建索引,从而减少Using filesort的使用。

  2. 数据预处理:对于数据集较大或者排序字段取值分布不均匀的情况,可以通过数据预处理的方式,对数据进行分段、分区等操作,从而减少Using filesort的性能开销。

  3. 覆盖索引:尽可能使用覆盖索引,即索引包含了所有查询所需的字段,避免Using filesort的使用。

  4. 手动干预查询执行计划:在某些情况下,查询优化器不一定能够选择最佳的执行计划。如果发现查询性能不佳,可以考虑手动干预查询执行计划,通过强制使用合适的索引或者改变查询语句的结构等方式来提升性能。

五、结论

Using filesort是MySQL中常见的排序操作,对于查询性能的影响较大。通过充分理解Using filesort的工作原理及影响因素,我们可以采取一系列的优化策略来提升查询性能。选择合适的排序字段、优化数据分布和排序结果、合理选择索引类型以及手动干预查询执行计划等手段,都可以帮助我们最大程度地减少Using filesort的使用,提高查询性能。

因此,在进行MySQL SQL优化时,特别是对于频繁进行排序操作的查询,我们应该充分了解Using filesort的工作原理,并根据实际情况采取相应的优化策略,从而提升查询性能,确保系统的稳定性和用户体验。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。