在MySQL EXPLAIN EXTENDED的上下文中,过滤的含义是什么?

时间:2016-11-11 16:10:24

标签: mysql select sql-execution-plan filtered-index

filtered在MySQL EXPLAIN EXTENDED的上下文中意味着什么?

MySQL Docs州:

  

过滤(JSON名称:已过滤)

     

过滤后的列表示将按表条件过滤的表行的估计百分比。也就是说,行显示了已检查的估计行数,而行×已过滤/ 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

1 个答案:

答案 0 :(得分:0)

我们没有您的查询可以使用,这对于这个问题确实不是正确的论坛,但要专门回答您的问题,您希望过滤返回100%的行,如果可能。当然,如果你查看手册,根据mysql的版本,过滤可能是一个大于100的数字,所以在这种情况下更像是一个比率。

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

在第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>

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