如MySQL 文档中所述:
过滤列表示将按表条件过滤的表行的估计百分比。也就是说, rows 显示检查的估计行数, rows × filters / 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。
在此处过滤意味着对由
type
-search 选择为潜在行的一组行应用条件,并仅保留满足条件的行:MySQL 将首先尝试使用索引,例如使用-key
range
对您的表进行扫描。它估计使用该索引可以获得 174 行,这是. 此步骤尚未称为过滤。a
search
rows
之后,必须根据附加条件检查这 174 行(通常在您的 -
where
子句中)。MySQL 现在估计只有 32 行,因此这 174 行中的 18% 将在应用该过滤器后保留。这 18% 是 中的值filtered
。虽然拥有 32 行而不是 174 行显然更好(例如,如果您必须稍后
join
使用另一个表),但“完美”索引会直接从初始搜索中为您提供这 32 行,从而节省您查看的时间并过滤掉所有潜在行的 82%。因此,较低的值可能表明可能存在更好的索引:例如,如果您添加了一个良好的索引,则使用 and 的全表扫描可能会
rows=1000
成为filtered=0.1%
索引查找。rows=1
filtered=100%
另一方面,您可以完全忽略此
filtered
值(无论如何,在大多数情况下,这是一个非常糟糕的估计),并专注于其他更重要的列(尤其是type
,key
和extra
)来优化您的查询。例如,最好去掉 afilesort
(例如通过使用满足 的索引order by
),即使它会导致较低的filtered
值。更好的type
可以带来巨大的性能改进,即使它可能不会改变甚至更低filtered
。在上面的示例中,使用filtered=0.1%
,type=all
已经足以表明您可以通过添加索引来改进该查询,而无需查看filtered
。所以不要太认真地对待这个值:既不
100
意味着你的索引是好的,一个较低的值也不一定表示坏的索引。type
是一个更好的指标。