这篇文章主要讲解了“MySQL explain中的rows是如何计算的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL explain中的rows是如何计算的”吧!
【背景铺垫】
相关表:
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 (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源码中的注释为:
简单翻译就是:这个方法仅仅根据给出的关于这个索引的条件和索引本身,来判断需要扫描多少行。
总结
感谢各位的阅读,以上就是“MySQL explain中的rows是如何计算的”的内容了,经过本文的学习后,相信大家对MySQL explain中的rows是如何计算的这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。