首页 > > > select count(*) 底层到底干了什么?
点击上方SQL数据库开发,关注获取SQL视频教程
SQL专栏

全表扫描,一个循环解决问题。
循环内: 先读取一行,再决定该行是否计入 count。
循环内是一行一行进行计数处理的。


join->optimize(),优化阶段 (稍后 myisam 下全表 count( * ) 操作会涉及这里的一点内容)。
join->exec(),执行阶段 ( 重点 ),包含了 InnoDB 下全表count( * ) 操作的执行流程。





e.g. SELECT COUNT(col_name) FROM t
col_name 可以是主键、唯一键、非唯一键、非索引字段
e.g-1. SELECT COUNT(*) FROM t
e.g-2. SELECT COUNT(B.*) FROM A LEFT JOIN B ON A.id = B.id


共性:共性存在于 SQL 层,即 SQL 解析之后的数据结构是一致的,count 变量都是存在于作为结果列的 Item_sum_count 类型对象中;返回给客户端的过程也类似 – 对该 count 变量进行赋值并经由 MySQL 通信协议返回给客户端。
区别:InnoDB 的 count 值计算是在 SQL 执行阶段进行的;而 MyISAM 表本身在内存中有一份包含了表 row_count 值的 meta 信息,在 SQL 优化阶段通过存储引擎的标记给优化器一个 hint,表明该表所用的存储引擎保存了精确行数,可以直接获取到,无需再进入执行器。

- END -
关注SQL数据库开发公众号,在后台回复关键字:资料领取,可以获取一份精心整理的技术干货。
推荐阅读
点击「阅读原文」了解SQL训练营
原文作者:;如有侵权,请联系管理员删除。