MySQL EXPLAIN EXTENDED过滤列(显然不是百分比)

Ale*_*eal 13 mysql explain

我一直在寻找这个,他们都说了某种百分比,解释一下:

EXPLAIN EXTENDED SELECT * FROM PageAccess ORDER BY AccessId DESC LIMIT 20;
SELECT COUNT(*) FROM PageAccess;
Run Code Online (Sandbox Code Playgroud)

赠送:

id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, Extra
1, 'SIMPLE', 'PageAccess', 'index', '', 'PRIMARY', '4', '', 20, 9295.00, ''
Run Code Online (Sandbox Code Playgroud)

(是的,过滤= 9295.00)

和:

1830
Run Code Online (Sandbox Code Playgroud)

对于计数(*)

是的我想要最后20行,AccessId是自动递增的主键.

9295是什么意思!?

Abh*_*rty 18

来源http://dev.mysql.com/doc/refman/5.5/en/explain-output.html#explain_filtered

筛选列指示将按表条件筛选的表行的估计百分比.也就是说,行显示了已检查的估计行数,而行×已过滤/ 100显示了将与之前的表连接的行数.如果您使用EXPLAIN EXTENDED,则会显示此列.

在过滤的100%中表示此表中的所有行都已过滤.因此,获得更高的价值并不令人担忧,因为它是一个好兆头,意味着它不必从表中读取尽可能多的数据.

这是它的计算方法.假设我有一个名为usersLets 的表,对它运行一些分析.

mysql> select count(*) from users ;
+----------+
| count(*) |
+----------+
|    79309 |
+----------+
Run Code Online (Sandbox Code Playgroud)

您可以看到表中有79309行.现在让我们来解释吧

mysql> explain extended select * from users order by idusers desc limit 20 ;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-----------+-------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | filtered  | Extra |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-----------+-------+
|  1 | SIMPLE      | users | index | NULL          | PRIMARY | 4       | NULL |   20 | 396545.00 |       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-----------+-------+
Run Code Online (Sandbox Code Playgroud)

现在想知道为什么 filtered = 396545.00

那么计算很简单.

该表的总行数= 79309表示其tx.

解释显示rows = 20表示其tx1.

过滤计算为

(tx / tx1)*100 = 396545.00
Run Code Online (Sandbox Code Playgroud)

所以如果这个值很高意味着查询是好的,而不是从表中读取所有内容.

因此,不要混淆这不是查询将看起来的行数,而是相对于获取的行数可用行数的%的相对计算.

如果它变为100,则表示查询正在查找表中的所有可用行.

  • @AbhikChakraborty - 我多年来一直在运行解释,但我从未见过高于 100 的任何东西。只有更低。由于它是一个百分比,表示连接所需的行数,它不能高于 100%。你上面给出的例子*实际*解释了查询的输出吗?如果是这样,您使用的是什么版本的 MySQL,因为它没有任何意义。 (6认同)