一文带你理解MySql中explain结果filtered

 更新时间:2022年09月09日 14:55:00   作者:xszhaobo  
使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,下面这篇文章主要给大家介绍了关于MySql中explain结果filtered的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

MySql explain语句的返回结果中,filtered字段要怎么理解?

MySql5.7官方文档中描述如下:

The filtered column indicates an estimated percentage of table rows filtered by the table condition. The maximum value is 100, which means no filtering of rows occurred. Values decreasing from 100 indicate increasing amounts of filtering. rows shows the estimated number of rows examined and rows × filtered shows the number of rows joined with the following table. For example, if rows is 1000 and filtered is 50.00 (50%), the number of rows to be joined with the following table is 1000 × 50% = 500.

这段文字不是很好理解,举例来说,有如下三个查询语句的explain结果,针对b和c表的显示filtered是100,而针对a表的显示是18。

+-------------+-------+--------+---------+---------+------+----------+
| select_type | table | type   | key     | key_len | rows | filtered |
+-------------+-------+--------+---------+---------+------+----------+
| PRIMARY     | a     | range  | search  | 4       |  174 |   18.00  |
| PRIMARY     | b     | eq_ref | PRIMARY | 4       |    1 |   100.00 |
| PRIMARY     | c     | ALL    | PRIMARY | 4       |    1 |   100.00 |

我们可以怎么理解filtered的值呢?从filtered的值中得出什么结论呢?到底是100更好还是18更好?

首先,这里的filtered表示通过查询条件获取的最终记录行数占通过type字段指明的搜索方式搜索出来的记录行数的百分比。

以上图的第一条语句为例,MySQL首先使用索引(这里的type是range)扫描表a,预计会得到174条记录,也就是rows列展示的记录数。接下来MySql会使用额外的查询条件对这174行记录做二次过滤,最终得到符合查询语句的32条记录,也就是174条记录的18%。而18%就是filtered的值。

更完美的情况下,应该是使用某个索引,直接搜索出32条记录并且过滤掉另外82%的记录。

因此一个比较低filtered值表示需要有一个更好的索引,假如type=all,表示以全表扫描的方式得到1000条记录,且filtered=0.1%,表示只有1条记录是符合搜索条件的。此时如果加一个索引可以直接搜出来1条数据,那么filtered就可以提升到100%。

由此可见,filtered=100%确实是要比18%要好。

当然,filtered不是万能的,关注执行计划结果中其他列的值并优化查询更重要。比如为了避免出现filesort(使用可以满足order by的索引),即使filtered的值比较低也没问题。再比如上面filtered=0.1%的场景,我们更应该关注的是添加一个索引提高查询性能,而不是看filtered的值。

参考内容:

MySQL :: MySQL 5.7 Reference Manual :: 8.8.2 EXPLAIN Output Format

innodb - What is the meaning of filtered in MySQL explain? - Database Administrators Stack Exchange

总结 

到此这篇关于MySql中explain结果filtered的文章就介绍到这了,更多相关MySql中explain结果filtered内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中如何正确存储IP地址

    MySQL中如何正确存储IP地址

    在MySQL中,当存储IPv4地址时,应该使用32位的无符号整数(UNSIGNED INT)来存储IP地址,而不是使用字符串,下面就来详细的介绍一下具体原因,感兴趣的可以了解一下
    2023-05-05
  • mysql命令导出表结构和数据的操作方法

    mysql命令导出表结构和数据的操作方法

    在日常使用中,我们经常需要对数据库进行备份和复制,因此必须了解如何导出表结构和表数据,以下是使用MySQL命令导出表结构和表数据的方法,感兴趣的朋友一起看看吧
    2023-11-11
  • MySQL 数据库如何解决高并发问题

    MySQL 数据库如何解决高并发问题

    这篇文章主要介绍了MySQL 如何处理高并发,帮助大家更好的优化MySQL数据库,感兴趣的朋友可以了解下
    2020-09-09
  • mysql报错ERROR 1396 (HY000): Operation ALTER USER failed for root@localhost解决方式

    mysql报错ERROR 1396 (HY000): Operation ALT

    这篇文章主要给大家介绍了关于mysql报错ERROR 1396 (HY000): Operation ALTER USER failed for root@localhost的解决方式,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-05-05
  • MySQL中进行数据的加密和解密存储的操作方法

    MySQL中进行数据的加密和解密存储的操作方法

    在MySQL中,我们可以使用对称加密算法和非对称加密算法对数据进行加密和解密存储,通过合理选择加密算法和密钥管理,可以有效提高数据的安全性,防止敏感信息的泄露和非法获取,下面给大家分享MySQL中进行数据的加密和解密存储方法,感兴趣的朋友一起看看吧
    2024-05-05
  • MySQL备份与恢复之冷备(1)

    MySQL备份与恢复之冷备(1)

    这篇文章主要介绍了MySQL备份与恢复之冷备,冷备一般需要定制计划,比如什么时候做备份,每次对哪些数据进行备份等等,对冷备感兴趣的小伙伴们可以参考一下
    2015-08-08
  • mysql 查询第几行到第几行记录的语句

    mysql 查询第几行到第几行记录的语句

    mysql 查询第几行到第几行记录 查询最后一行和第一行记录 查询前几行和后几行记录
    2011-07-07
  • MySQL中distinct和count(*)的使用方法比较

    MySQL中distinct和count(*)的使用方法比较

    这篇文章主要针对MySQL中distinct和count(*)的使用方法比较,对两者之间的使用方法、效率进行了详细分析,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)

    Mysql LONGTEXT 类型存储大文件(二进制也可以) (修改+调试+整理)

    MySql2.cpp : Defines the entry point for the console application.
    2009-07-07
  • 查看连接mysql的IP地址的实例方法

    查看连接mysql的IP地址的实例方法

    在本篇文章里小编给大家分享的是一篇关于查看连接mysql的IP地址的实例方法,有需要的朋友们可以参考下。
    2020-10-10

最新评论