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_uuid
但 key = NULL
.
在 EXPLAIN
中看到“顺”
在某些情况下,将 优化程序做出 'wrong' 选择。但我们可以在另一个问答中讨论。
我有一个 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_uuid
但 key = NULL
.
EXPLAIN
中看到“顺”
在某些情况下,将 优化程序做出 'wrong' 选择。但我们可以在另一个问答中讨论。