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