在 MySQL EXPLAIN EXTENDED 的上下文中过滤是啥意思?

Posted

技术标签:

【中文标题】在 MySQL EXPLAIN EXTENDED 的上下文中过滤是啥意思?【英文标题】:What does filtered mean in the context of MySQL EXPLAIN EXTENDED?在 MySQL EXPLAIN EXTENDED 的上下文中过滤是什么意思? 【发布时间】:2017-03-25 21:59:24 【问题描述】:

filteredmysql EXPLAIN EXTENDED 的上下文中是什么意思?

MySQL Docs 状态:

已过滤(JSON 名称:已过滤)

过滤列表示将按表格条件过滤的表格行的估计百分比。也就是说, rows 显示检查的估计行数, rows × filters / 100 显示将与以前的表连接的行数。在 MySQL 5.7.3 之前,如果您使用 EXPLAIN EXTENDED,则会显示此列。从 MySQL 5.7.3 开始,默认启用扩展输出,不需要 EXTENDED 关键字。

但我仍然没有头绪。例如,100.00 是否意味着它很好?如果我有43.61 是什么意思?好点吗?更差?我应该尝试拥有 100.00 吗?

它只是为了信息目的吗?假设我有两个相似的查询,它们连接不同的键,但根据 SQL ER 结构和业务逻辑生成相同的行和值。一个查询报告所有连接的值为 100.00,另一个查询报告其中一个连接为 43.61,其他连接为 100.00。我可以从这个数字中学到什么?

示例:

+-------------+-------+--------+---------+---------+------+----------+
| select_type | table | type   | key     | key_len | rows | filtered |
+-------------+-------+--------+---------+---------+------+----------+
| PRIMARY     | job   | range  | status  | 122     |  512 |   100.00 |
| PRIMARY     | user  | eq_ref | PRIMARY | 4       |    1 |   100.00 |
| PRIMARY     | item  | eq_ref | PRIMARY | 4       |    1 | -> 43.61 | <--
+-------------+-------+--------+---------+---------+------+----------+

另见

https://dba.stackexchange.com/a/164360

【问题讨论】:

我可能完全不在话下,但我不相信 filtered 值是好/坏的限定符,而只是查询正在做什么的额外指标? 如果我理解 filtered 意味着我们“丢弃”了 100 - 43.61 = 56.39% 的行,这意味着我们没有检查 56.39% 的行,因为无论出于何种逻辑,我们都知道它们不适用。在这种情况下,我希望数据库检查更少的行,因为这样会更有效率。 100.00 表示“我们必须查看所有行”并且不能“过滤”或丢弃任何行。也许? 我开始认为这是由于WHERE 条件...查询查看WHERE 子句并丢弃不匹配的行。我想这意味着过滤(排除)不适用的行。所以 43.61 可能意味着我们根据您的 WHERE 子句按百分比丢弃了那么多行。再说一次,也许吧。 按照文档,它似乎对 JOIN 的约束比 WHERE 做得更多? 那么,有什么结论吗? mysql中的filtered意味着什么解释?我也很好奇。 【参考方案1】:

我们无法处理您的查询,而且这确实不是该问题的正确论坛,但要专门回答您的问题,您希望您的过滤尽可能返回 100% 的行。当然如果你看手册,根据mysql的版本,filtered可能是一个大于100的数字,所以这种情况更像是一个比率。

在使用作业索引的初始“范围”优化中,您没有过滤任何行。所以这是最优的,因为索引完全覆盖了标准,结果数据不需要减少。

在第 2 步中,这些作业已加入到用户。只有 1 个用户匹配,因此您的中间结果是 1 个用户 * 512 个工作。

在您要加入项目表的最终联接 (eq_ref) 中,有 1 个项目行符合条件。但现在,正在应用一些过滤,在 1 * 512 行中,最终只有 43% 被返回。这可能会通过索引来改善,尽管这可能不值得开销。

这是一个小的结果集,所以它不是一个真正的大问题,但它告诉你的是 mysql 必须遍历 512 行并通过过滤做一些额外的减少。

再次没有查询,很难说对数据的一些具体理解,但我可以给你一个提示,可以帮助你获得更多的洞察力是利用 format=json 参数,它将显示一些额外的信息,特别是 rows_examined_per_scan 和 rows_produced_per_join。

具体来说你应该试试这个:

explain format=json <your query>

如果您想进一步探索,可以使用该数据更新问题,但查询也会有所帮助。

【讨论】:

以上是关于在 MySQL EXPLAIN EXTENDED 的上下文中过滤是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL执行计划

MySQL explain用法

mysql explain 执行计划详解

mysql explain 命令讲解

MySQL explain语法

mysql中explain用法和结果的含义