微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mysql:解释返回的行数比实际数多

如何解决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?

谢谢

更新

1、上述查询可能需要几分钟。正常吗?如何调整性能

2、我打算在s_uuid上创建索引。我想它会提高性能。我说得对吗?

解决方法

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

不过,估计值通常“足够好”,优化器可以决定如何执行查询。

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

SHOW TABLE STATUS LIKE 'xxxs';

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

INDEX(s_uuid)

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

将会优化器做出“错误”选择的情况。但我们可以在另一个问答中讨论这个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?