如何解决Mysql:解释返回的行数比实际数多
我有一张表,按计数包含 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?
谢谢
更新
2、我打算在s_uuid上创建索引。我想它会提高性能。我说得对吗?
解决方法
EXPLAIN
中的“行”是基于最近收集的统计数据的估计值。该值很少是准确的;有时甚至相差两倍以上。
不过,估计值通常“足够好”,优化器可以决定如何执行查询。
另一个查看行数估计值的地方是通过
SHOW TABLE STATUS LIKE 'xxxs';
(如评论中所述)添加此内容可能加快select * from xxxs where s_uuid = "21eaef";
:
INDEX(s_uuid)
我说“可能”是因为,如果很多行都有 s_uuid = "21eaef"
,优化器将避开索引并简单地扫描整个表,而不是从索引的 BTree 和数据的 BTree 来回弹跳。您可以通过 EXPLAIN
但 Possible keys = idx_uuid
看到 key = NULL
中的“避开”。
将会优化器做出“错误”选择的情况。但我们可以在另一个问答中讨论这个问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。