`
宋双旺
  • 浏览: 157550 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mysql之EXPLAIN显示using filesort

阅读更多

EXPLAIN 是mysql解释select查询的一个关键字,可以很方便的用于调试
语法格式如下
EXPLAIN tbl_name
或者:
EXPLAIN SELECT select_options
EXPLAIN 语句可以被当作 DESCRIBE 的同义词来用,也可以用来获取一个MySQL要执行的 SELECT 语句的相关信息。

EXPLAIN tbl_name 语法和 DESCRIBE tbl_name 或 SHOW COLUMNS FROM tbl_name 一样。

当在一个 SELECT 语句前使用关键字 EXPLAIN 时,MYSQL会解释了即将如何运行该 SELECT 语句,它显示了表如何连接、连接的顺序等信息。

以下信息为引用:

在explain我们所使用的sql的时候,经常会遇到using filesort这种情况,原以为是由于有相同列值的原因引起,结果昨天看到公司的一个sql,跟同事讨论了下加上自己又做了一些测试,突然发现自己原来的想法是错误的。

首 先,只有在order by 数据列的时候才可能会出现using filesort,而且如果你不对进行order by的这一列设置索引的话,无论列值是否有相同的都会出现using filesort。因此,只要用到order by 的这一列都应该为其建立一个索引。

其次,在这次测试中,使用了一个稍微有点复杂的例子来说明这个问题,下面详细用这个例子说一下:

SELECT * FROM DB.TB WHERE ID=2222 AND FID IN (9,8,3,13,38,40) ORDER BY INVERSE_DATE LIMIT 0, 5
里面建立的索引为一个三列的多列索引:IDX(ID,FID ,INVERSE_DATE) 。INVERSE_DATE这个是时间的反向索引。

对于这个sql我当时最开始认为应该是个优化好的状态,应该没有什么纰漏了,结果一explain才发现竟然出现了:Using where; Using filesort。

为 什么呢,后来经过分析才得知,原来在多列索引在建立的时候是以B-树结构建立的,因此建立索引的时候是先建立ID的按顺序排的索引,在相同ID的情况下建 立FID按 顺序排的索引,最后在FID 相同的情况下建立按INVERSE_DATE顺序排的索引,如果列数更多以此类推。有了这个理论依据我们可以看出在这个sql使用这个IDX索引的时候只 是用在了order by之前,order by INVERSE_DATE 实际上是using filesort出来的。。汗死了。。因此如果我们要在优化一下这个sql就应该为它建立另一个索引IDX(ID,INVERSE_DATE),这样就消 除了using filesort速度也会快很多。问题终于解决了

 

 

 

Using filesort表示在索引之外,需要额外进行外部的排序动作。导致该问题的原因一般和order by有者直接关系,一般可以通过合适的索引来减少或者避免。

 

 

explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_id LIMIT 0, 5
user_id 和 item_id 分别建立一个索引,对此语句MySQL选择了 user_id索引,那么 item_id 的索引没有起到任何用处。当排序时记录数较多,内存中的排序 buffer满了,只能 Using filesort 进行外部排序。
解决方式为对这两列建立组合索引。

 

 

explain SELECT * FROM table_item WHERE user_id = 2 and user_age > 20 ORDER BY item_id LIMIT 0, 5
建立组合索引(user_id, user_age, item_id),看似非常完美。但由于user_age规则不是确定值,使用该组合索引的话实际上需要先按索引找出一个个user_age下的东西后再对其进行排序,仍然会filesort。
解决方式是使用组合索引(user_id, item_id),对排序好的item_id再过滤到不满足user_age > 20的条目,不会出现filesort。

 

 

explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_attr desc, item_id LIMIT 0, 5
建立了组合索引(user_id, item_attr, item_id),因为item_attr是降序而item_id是升序,从而仍然需要外部排序。
如果item_attr和item_id都是升序或者都是降序,则不会出现filesort;建立组合索引(user_id, item_attr desc, item_id)现象依旧。
Mysql5.1 在线文档“13.1.4. CREATE INDEX语法”中提到:“一个index_col_name规约可以以ASC或DESC为结尾。这些关键词将来可以扩展,用于指定递增或递减索引值存 储。目前,这些关键词被分析,但是被忽略;索引值均以递增顺序存储。”
可以看出无法通过修改索引来避免这个filesort,只能是如果可能的话修改查询的排序条件
分享到:
评论

相关推荐

    Mysql之EXPLAIN显示using filesort介绍

    当我们看到`EXPLAIN`输出中的`Using filesort`,这意味着MySQL无法利用索引来对查询结果进行排序,而必须采用一种更耗时的全内存排序方法。这通常发生在`ORDER BY`子句中涉及的列没有合适索引或者`GROUP BY`操作无法...

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    然而,在某些情况下,MySQL可能会使用`Using filesort`来完成这些操作,这通常会导致性能下降。本文将深入探讨`Using filesort`的原理及其在`ORDER BY`和`GROUP BY`中的应用。 1. **SQL执行顺序** 在一个SQL查询中...

    mysql+explain实例分析

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其性能优化是数据库管理员和开发人员的关键技能。在本篇文章中,我们将深入探讨"mysql+explain实例分析"这一主题,以理解如何利用`EXPLAIN`命令来优化MySQL...

    Mysql中explain的说明

    ### MySQL中EXPLAIN命令详解 #### 一、概述 在MySQL数据库管理中,查询优化是一项非常重要的工作。通过优化查询,不仅可以提升查询速度,还能节省系统资源,提高系统的整体性能。`EXPLAIN`命令作为MySQL提供的一种...

    MySQL explain 笔记整理

    - **Using filesort**:表示 MySQL 需要使用额外的排序步骤来获取有序的结果集。 #### 三、EXPLAIN 的高级用法 - **Extended EXPLAIN**:除了基本的 EXPLAIN 之外,还可以使用 `EXPLAIN FORMAT=JSON` 或 `EXPLAIN...

    mysql的explain分析sql语句性能(慢查询和加没加索引)

    10. Extra:额外的重要信息,常见且重要的有:using filesort(文件内排序,MySQL 无法用给定的索引进行排序,在内部重新排序)、using temporary(使用了临时表,一般在 group by 中),using index(最好的一种,...

    mysql explain详解

    MySQL中的`EXPLAIN`命令是用于分析SQL查询执行计划的重要工具,它可以帮助数据库管理员和开发者了解MySQL如何处理SQL语句,从而进行性能优化。在深入理解`EXPLAIN`之前,我们先来了解一下数据库优化的基本概念。 ...

    mysql explain详解1

    如果`Extra`中出现`Using filesort`,说明MySQL可能需要额外步骤来排序结果,这也是一种性能瓶颈。 总之,MySQL的EXPLAIN工具是优化SQL查询性能的关键,通过分析其输出,我们可以找出查询的瓶颈,优化索引策略,...

    mysql之explain使用详解(分析索引)

    - `using filesort`:表示MySQL需要对结果进行额外的排序步骤,这通常是低效的。 - `using index`:表示MySQL仅使用索引获取所有需要的数据,无需读取实际的表行。 - `using where`:表示使用了WHERE子句来限制...

    深入解析:使用EXPLAIN优化MySQL查询之旅

    ### 深入解析:使用 EXPLAIN 优化 MySQL 查询之旅 #### 一、MySQL简介与特点 MySQL作为一款流行的开源关系型数据库管理系统(RDBMS),因其强大的功能与灵活性,在Web应用程序开发领域占据着举足轻重的地位。它不仅...

    mysqlexplain-100712043803-phpapp01.ppt

    看到Extra中的Using filesort或Using temporary,意味着可能需要调整JOIN顺序或添加索引。 六、总结 掌握`EXPLAIN`工具的使用,是每个MySQL数据库管理员和开发者必备的技能。通过深入理解查询执行计划,我们可以更...

    MySQL 是怎样运行的:从根儿上理解 MySQL(下).pdf

    * Using filesort:当查询使用了文件排序时,将会提示该额外信息。 了解 Explain 语句输出的各个列的意思,可以帮助我们更好地理解 MySQL 是怎样运行的,并帮助我们进行查询优化。但是,需要注意的是,Explain 语句...

    explain的用法

    8. **Extra**:提供关于MySQL如何解析查询的额外信息,如`Using temporary`(使用临时表)、`Using filesort`(文件排序)等。 - **Using temporary**:表示MySQL需要创建临时表来存储中间结果,这可能导致性能下降...

    Mysql Explain 详细介绍

    - 注意`Extra`列中的`Using where`、`Using filesort`和`Using temporary`,这些都可能影响性能。 4. **实例代码** 下面的例子展示了如何使用EXPLAIN来分析查询: ```sql EXPLAIN SELECT * FROM t3 WHERE id = ...

    explain也是mysql的关键字

    若`Extra`中出现“Using filesort”,可能需要调整查询语句以避免文件排序操作,这通常会导致性能下降。 此外,标签“源码”和“工具”提示我们,可能需要关注的是P6Spy,这是一个开源的Java库,用于监控和记录...

    MySql优化.pdf

    通过对`EXPLAIN`输出的分析,我们可以识别出可能导致低效的查询,如全表扫描(`type`为ALL)、未使用索引(`key`为NULL)或不必要的排序(`Extra`中有Using filesort),并据此优化查询语句或调整索引策略。 总的来说,...

Global site tag (gtag.js) - Google Analytics