MySQL解释中的filter的含义是什么?


21

如此处的MySQL文档所述

已过滤的列指示将被表条件过滤的表行的估计百分比。也就是说,行显示了检查的行的估计数,行×过滤后的行数/ 100显示了将与以前的表连接的行数。在MySQL 5.7.3之前,如果使用EXPLAIN EXTENDED,则会显示此列。从MySQL 5.7.3开始,默认情况下启用扩展输出,并且EXTENDED关键字是不必要的。

我还是不明白。“过滤”在这里是什么意思?我们可以从本专栏获得什么信息?

例如,当我开始查询时,某些查询将显示100,而另一些则显示18或任何低于100的查询。

+-------------+-------+--------+---------+---------+------+----------+
| 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 |

我们可以从该值得出什么主要结论?

就是说,该栏仅过滤了18%?或者,如果分数越低,则索引/查询越好?

我正在使用MySQL 5.7

Answers:


30

此处进行过滤意味着对type-search 选择为潜在行的一组行应用条件,并仅保留满足条件的行:

MySQL将首先尝试使用索引,例如,使用-key range对表a进行扫描search。估计使用该索引(即中的数字)可获得174行rows。此步骤尚未称为过滤。

之后,必须针对其他条件(通常在where-clause中)检查这174行。MySQL现在估计只有32行,因此在应用该过滤器后将剩下174行中的18%。这18%是中的值filtered

虽然最好是用32行而不是174行(如果您以后join要用另一个表),但是“完美”索引可以直接从初始搜索中为您提供这32行,从而节省了查看时间并过滤掉所有潜在行的82%。

因此,较低的值可能表示可能存在更好的索引:例如,如果添加了良好的索引,则使用rows=1000和进行的全表扫描filtered=0.1%可能会成为索引查找。rows=1filtered=100%

在另一方面,可以很好地完全忽略这filtered-值(在大多数情况下,一个非常糟糕的估计是这样),以及专注于其他更重要的列(特别是typekeyextra)来优化您的查询。例如,最好删除filesort(例如通过使用满足的索引order by),即使它导致较低的filtered值。和更好的type可导致巨大的性能提升,即使它可能不会改变,甚至更低filtered。在上面带有的示例中filtered=0.1%type=all已经足以表明您可以通过添加索引来改善查询,而filtered根本不用看。

因此,不要过于重视该值:既不100意味着您的索引是好的,也不意味着较低的值不一定表示坏的索引。type这是一个更好的指标。


1
感谢您的解释。这为我解释了很多。我认为这对于维护和选择良好的指标很有用
Iman Tumorang

@ImanTumorang我添加了一个评论和一个有关此示例:不要太重视该值。您可以仅通过查看typeextra(这本身就是一种艺术)来优化查询;你可以没有filtered,但不能没有生活type
Solarflare

好吧。我知道了。我已经在Mysql Docs中阅读了它们如何影响性能。感谢您的解释:D
伊曼·图莫朗

另一个提示:筛选的计算将跳过最后一个联接的表。也就是说,即使实际上有条件会过滤掉某些检查的行,它也会显示100%。理由是估计筛选因子会花费一些钱,并且如果它在最后一张表上,这不会影响查询执行计划,因此它们默认跳过计算。
Bill Karwin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.