MySQLexplain中的rows是如何计算的

这篇文章主要讲解了“MySQL explain中的rows是如何计算的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL explain中的rows是如何计算的”吧!

创新互联于2013年创立,先为巴青等服务建站,巴青等地企业,进行企业商务咨询服务。为巴青企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

【背景铺垫】

相关表:

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;

MySQL explain中的rows是如何计算的

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

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

EXPLAIN SELECT COUNT(*)

FROM test_table

WHERE id >= 10000

LIMIT 10;

MySQL explain中的rows是如何计算的

疑问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源码来看看:

文件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 explain中的rows是如何计算的”的内容了,经过本文的学习后,相信大家对MySQL explain中的rows是如何计算的这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!

新闻标题:MySQLexplain中的rows是如何计算的
链接地址:https://www.cdcxhl.com/article24/iippje.html

成都网站建设公司_创新互联,为您提供定制开发微信小程序响应式网站定制网站搜索引擎优化网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

手机网站建设