为何MySQL中针对PK的比较、排序、Limit查询行访问量偏高?
为什么带
WHERE id>N、ORDER BY id和LIMIT 5的EXPLAIN中rows显示满足条件的总行数而非5? 问题场景
- 表的
id是主键(PK),总行数为541 - 执行以下查询时,
EXPLAIN的rows字段结果如下:explain select * from mytable where id > 50 order by id limit 5;→rows=491explain select * from mytable where id > 200 order by id limit 5;→rows=341explain select * from mytable where id > 400 order by id limit 5;→rows=141
- 预期
rows值为5,但实际显示的是满足id > N的总行数
原因解释
首先要明确:EXPLAIN中的rows字段,代表的是MySQL优化器预估的、符合WHERE条件的总行数,不是最终返回的行数,也不是实际执行时会扫描的行数。
具体到这个场景:
- 因为
id是主键,主键索引是天生有序的B+树结构,id > N的所有行在索引里是连续的一段。优化器知道可以直接从N+1的位置开始读取数据,而且ORDER BY id完全可以利用主键索引的顺序,不需要额外做排序操作。 - 优化器在计算
rows值时,是基于统计信息算出满足id > N的总行数(也就是541 - N),它并不会把LIMIT 5的逻辑纳入到rows的预估里——因为rows的设计目的是展示过滤后的数据集规模,而不是最终返回的行数。 - 实际执行效率不受影响:虽然
rows显示的是几百行,但数据库只会从主键索引的对应位置开始读取,拿到5行数据就立刻停止,不会真的扫描所有491/341/141行。
内容的提问来源于stack exchange,提问作者user15443492
相关产品推荐
相关产品推荐

