MySQL explain 中的 rows 究竟是如何计算的?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 今天同事在处理系统慢SQL时遇到几个疑惑的问题,简单描述如下~

微信图片_20220607205655.png

今天同事在处理系统慢SQL时遇到几个疑惑的问题,简单描述如下~


【背景铺垫】


相关表:

CREATE TABLE test_table (
  id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  name varchar(32) NOT NULL,
  PRIMARY KEY (id)
) ENGINE = InnoDB CHARSET = utf8mb4;


test_table 表记录数约12w+


问题描述


相关SQL:

EXPLAIN SELECT COUNT(*)
FROM test_table
WHERE id >= 10534
  AND id <= 15375;

微信图片_20220607205759.png


疑问1:上述SQL理应按id主键(聚簇索引)范围查找,为啥explain里的rows会多余两者之差呢?


在SQL结尾处增加 LIMIT 10 后,rows数值竟然没有任何影响(觉得可能会变为: 10)。


EXPLAIN SELECT COUNT(*)
FROM test_table
WHERE id >= 10000
LIMIT 10;

微信图片_20220607205802.png


疑问2LIMIT值不会影响rows的值么?


rows究竟是怎么计算的呢?


这个rows在官网文档中的解释如下:


rows (JSON name: rows)
The rows column indicates the number of rows MySQL believes it must examine to execute the query.
For [InnoDB] tables, this number is an estimate, and may not always be exact.


http://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_rows


简单理解即:这个rows就是mysql认为估计需要检测的行数。


为了探究rows究竟是如何算出来的,查找MYSQL源码来看


文件1:sql/opt_explain_traditional.cc
   关键部分:push(&items, column_buffer.col_rows, nil)
文件2:sql/opt_explain.cc
   关键部分:select->quick->records
文件3:sql/opt_range.cc
   关键部分:check_quick_select


而check_quick_select的功能,在MySQL源码中的注释为:


“Calculate estimate of number records that will be retrieved by a range scan on given index using given SEL_ARG intervals tree.

简单翻译就是:这个方法仅仅根据给出的关于这个索引的条件和索引本身,来判断需要扫描多少行。


总结


MySQL Explain 里的 rows 这个值


  • 是MySQL认为它要检查的行数(仅做参考),而不是结果集里的行数;


  • 同时 SQL里的 LIMIT 和这个也是没有直接关系的


另外,很多优化手段,例如关联缓冲区和查询缓存,都无法影响到rows的显示。MySQL可能不必真的读所有它估计到的行,它也不知道任何关于操作系统或硬件缓存的信息。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
11月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
2336 10
|
分布式计算 关系型数据库 MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
大数据-88 Spark 集群 案例学习 Spark Scala 案例 SuperWordCount 计算结果数据写入MySQL
142 3
|
存储 监控 关系型数据库
MySQL计算某条数据与上一条数据的生成时间差
MySQL计算某条数据与上一条数据的生成时间差
275 2
|
SQL 关系型数据库 MySQL
MySQL EXPLAIN该如何分析?
本文将详细介绍MySQL中`EXPLAIN`关键字的工作原理及结果字段解析,帮助优化查询性能。`EXPLAIN`可显示查询SQL的执行计划,其结果包括`id`、`select_type`、`table`等字段。通过具体示例和优化建议,帮助你理解和应用`EXPLAIN`,提升数据库查询效率。
618 1
|
SQL 关系型数据库 MySQL
mysql性能调优:EXPLAIN命令21
【7月更文挑战第21天】掌握SQL性能调优:深入解析EXPLAIN命令的神奇用法!
206 1
|
SQL 缓存 关系型数据库
MySQL|浅谈explain的使用
【7月更文挑战第11天】
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
121 3
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。

推荐镜像

更多