在 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 【问题描述】:filtered
在 mysql 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 的上下文中过滤是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章