MySQL Explain Filtered字段

在MySQL中,当我们对一条SQL语句执行EXPLAIN命令时,会返回一个查询计划的解释,这个解释包含了许多有用的信息,以帮助我们优化查询性能。其中一个重要的字段是filtered字段。本文将介绍filtered字段的含义以及如何使用它来优化查询。

什么是filtered字段?

在MySQL的查询计划中,filtered字段表示在读取表数据之后,通过过滤条件所剩下的数据的比例。这个比例是一个估算值,取值范围是0到1,0表示过滤条件筛选后没有剩余的数据,1表示过滤条件筛选后完整的保留了所有数据。

filtered字段的含义

filtered字段的值越接近1,说明过滤条件筛选后保留的数据比例越高,查询效果越好。反之,如果filtered字段的值接近0,说明过滤条件筛选后保留的数据比例很低,查询效果较差。

对于一个表,如果某个列有索引,并且查询中使用了这个索引,那么根据索引对表进行扫描后,就可以通过过滤条件将不符合查询条件的数据过滤掉,这样可以大大提高查询效率。filtered字段的值就表示了通过索引过滤后保留的数据比例。

如何使用filtered字段优化查询

当我们的查询效率低下时,可以通过查看filtered字段的值,来判断查询是否充分利用了索引。如果filtered字段的值接近1,说明查询条件与索引的匹配度非常高,查询效率也较高。反之,如果filtered字段的值接近0,说明查询条件与索引的匹配度较低,需要优化查询条件或者索引。

下面是一个简单的示例,用于演示如何利用filtered字段来优化查询。

假设我们有一个user表,包含idname两个字段,其中id是主键,name列没有索引。

CREATE TABLE `user` (
  `id` INT PRIMARY KEY,
  `name` VARCHAR(100)
);

INSERT INTO `user` (`id`, `name`) VALUES (1, 'Alice');
INSERT INTO `user` (`id`, `name`) VALUES (2, 'Bob');
INSERT INTO `user` (`id`, `name`) VALUES (3, 'Alice');

现在我们想要查询名为'Alice'的用户。我们可以使用如下的SQL语句进行查询:

EXPLAIN SELECT * FROM `user` WHERE `name` = 'Alice';

执行上述SQL语句后,我们会得到一个查询计划,其中包含了一列名为filtered的字段。通过查看这个字段的值,我们可以了解到查询条件与索引的匹配度。

接下来是一个饼状图,用来表示一张表的数据情况:

pie
  "过滤后保留的数据" : 0.8
  "过滤后丢弃的数据" : 0.2

在这个示例中,我们使用了等值条件查询name为'Alice'的用户,由于name列没有索引,因此无法通过索引进行优化。执行上述查询后,filtered字段的值应该接近0.3333,表示只有1/3的数据满足查询条件。

现在,我们在name列上添加一个索引,并重新执行查询:

ALTER TABLE `user` ADD INDEX `idx_name` (`name`);

EXPLAIN SELECT * FROM `user` WHERE `name` = 'Alice';

执行上述查询后,filtered字段的值应该接近1,表示绝大部分数据都满足查询条件。这说明我们的查询已经充分利用了索引。

通过观察filtered字段的值,我们可以得出以下结论:

  • filtered字段的值接近1时,说明查询条件与索引的匹配度很高,查询效率较高。
  • filtered字段的值接近0时,说明查询条件与索引的匹配度