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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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可能不必真的读所有它估计到的行,它也不知道任何关于操作系统或硬件缓存的信息。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
mysql性能调优:EXPLAIN命令21
【7月更文挑战第21天】掌握SQL性能调优:深入解析EXPLAIN命令的神奇用法!
41 1
|
3月前
|
SQL 缓存 关系型数据库
MySQL|浅谈explain的使用
【7月更文挑战第11天】
|
3月前
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
|
3月前
|
关系型数据库 MySQL 数据库
MySQL 保姆级教程(八):创建计算字段
MySQL 保姆级教程(八):创建计算字段
|
3月前
|
SQL 索引 关系型数据库
MySQL设计规约问题之为什么推荐使用EXPLAIN来检查SQL查询
MySQL设计规约问题之为什么推荐使用EXPLAIN来检查SQL查询
|
4月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
MySQL数据库——索引(4)-SQL性能分析-profile详情、explain(profile查看指令,explain执行计划中各个字段的含义)
48 2
|
4月前
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用问题之mysql读取从mc里的每10分钟计算好的结果数据表,如何同步数据过去
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
4月前
|
存储 SQL 关系型数据库
MySQL快速回顾:计算字段与函数
MySQL快速回顾:计算字段与函数
|
4月前
|
关系型数据库 MySQL Serverless
【随手记】MySQL窗口函数计算累加和
【随手记】MySQL窗口函数计算累加和
283 0
下一篇
无影云桌面