mysql执行计划中rows代表什么_mysql执行计划rows解析

3次阅读

rows 是 mysql 优化器基于统计信息估算的扫描行数,非实际值;受统计更新、索引选择性、直方图及查询条件影响,需结合 type、key、Extra 综合判断性能问题。

mysql 执行计划中 rows 代表什么_mysql 执行计划 rows 解析

rows 表示 MySQL 查询优化器预估的、为获取结果需要扫描或检查的行数,不是实际执行后的精确值,而是基于统计信息做出的估算。

rows 是估算值,不是真实扫描数

MySQL 在真正执行 SQL 前,会通过采样和统计信息(如索引基数、表总行数、直方图等)预测满足条件的数据量。这个预测值写在 rows 列中,用于指导优化器选择成本更低的执行路径(比如走全表扫描还是走某个索引)。它可能偏高或偏低,尤其在数据分布不均、统计信息过期、使用模糊查询(LIKE '%abc')或函数包裹字段(WHERE YEAR(create_time) = 2024)时,误差更明显。

  • 全表扫描时,rows ≈ 表的总行数估计值(来自 mysql.innodb_table_stats
  • 索引扫描时,rows ≈ 满足 WHERE 条件的索引记录条数估计值
  • 如果 EXPLaiN 显示 rows = 1,常见于主键 / 唯一索引等值查询(consteq_ref 类型)

影响 rows 准确性的关键因素

优化器无法“未卜先知”,它的估算依赖底层统计质量:

  • 统计信息是否及时更新:执行 ANALYZE TABLE table_name; 可手动刷新,避免因大批量写入后统计滞后导致误判
  • 索引选择性(Cardinality)是否合理:基数越接近总行数,索引过滤能力越强;性别字段基数只有 2,优化器自然不太愿用它
  • 是否有直方图(Histogram):MySQL 8.0+ 支持列级直方图,对非均匀分布字段(如订单金额、访问时间)能显著提升 rows 预估精度
  • 查询条件是否可下推到存储引擎层 :带函数、 类型转换 隐式转换 的条件常导致优化器放弃使用索引统计,转而粗略估算

如何结合 rows 判断性能问题

单独看 rows 数值意义有限,需结合 typekeyExtra 综合判断:

  • type = ALLrows 接近表总行数 → 很可能缺失有效索引,考虑添加或调整
  • type = rangerows 远大于实际返回行数 → 索引区分度差或条件写法不当(如用了前导通配符)
  • rows 很小但查询仍慢 → 关注 Extra 中是否出现 using filesortUsing temporary,说明排序 / 分组未走索引
  • 对比加索引前后的 rows 变化:若加了索引后 rows 从 10 万降到 200,说明索引被有效利用

rows 和 filtered 区别

rows 是存储引擎层预估要读取的行数(即“找多少行”),而 filtered 是 Server 层预估这些行中最终满足 WHERE 条件的比例(百分比)。两者相乘 ≈ 最终返回给上层的行数(例如 rows=1000, filtered=10.00 → 预估 100 行满足条件)。注意:filtered 值低(如

站长
版权声明:本站原创文章,由 站长 2025-12-18发表,共计1157字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
1a44ec70fbfb7ca70432d56d3e5ef742
text=ZqhQzanResources