Mysql:说明比实际多returns行

Mysql: explain returns more rows than the actual number

我有一个 table,它包含 40 M 行。

select count(*) from xxxs;
returns 38000389

但解释:

mysql> explain select * from xxxs where s_uuid = "21eaef";
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows     | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
|  1 | SIMPLE      | xxxs  | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 56511776 |    10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+----------+----------+-------------+
1 row in set, 1 warning (0.06 sec)

为什么行数是 56M,比 40M 大很多?

谢谢

更新

1、以上查询可能需要几分钟时间。正常吗?如何调优性能?

2,我打算在s_uuid上创建一个索引。我想这会提高性能。我说得对吗?

EXPLAIN 中的“行数”是根据最近收集的统计数据估算的。该值很少是准确的;有时甚至相差两倍以上。

不过,对于优化器决定如何执行查询而言,估计通常“足够好”。

另一个查看行数估计值的地方是

SHOW TABLE STATUS LIKE 'xxxs';

(如评论中所述)添加此 可能 以加快 select * from xxxs where s_uuid = "21eaef";:

INDEX(s_uuid)

我说“可能”是因为,如果很多行都有 s_uuid = "21eaef",优化器将避开索引并简单地扫描整个 table,而不是从索引的行来回跳动BTree 和数据的 BTree。您可以通过 Possible keys = idx_uuidkey = NULL.

EXPLAIN 中看到“顺”

在某些情况下, 优化程序做出 'wrong' 选择。但我们可以在另一个问答中讨论。