前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL explain 中的 rows 究竟是如何计算的?

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

作者头像
架构精进之路
修改2020-08-19 16:47:52
2.9K0
修改2020-08-19 16:47:52
举报
文章被收录于专栏:架构精进之路架构精进之路

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

【背景铺垫】

相关表:

代码语言:javascript
复制
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;

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

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

EXPLAIN SELECT COUNT(*)

FROM test_table

WHERE id >= 10000

LIMIT 10;

疑问2:LIMIT值不会影响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源码来看看:

代码语言:javascript
复制
文件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可能不必真的读所有它估计到的行,它也不知道任何关于操作系统或硬件缓存的信息。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构精进之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档