美团面试官:你知道 SELECT COUNT(*) 底层究竟干了啥吗?
InnoDB 全表 COUNT(*)
主要问题:
1、执行过程是怎样的?
1.1、基本结论:
全表扫描,一个循环解决问题。 循环内: 先读取一行,再决定该行是否计入 count。 循环内是一行一行进行计数处理的。
2.1、COUNT( * ) 前置流程回忆 – 从 Client 端发 SQL 到 sub_select 函数
join->optimize(),优化阶段 (稍后 myisam 下全表 count( * ) 操作会涉及这里的一点内容)。 join->exec(),执行阶段 ( 重点 ),包含了 InnoDB 下全表count( * ) 操作的执行流程。
2.2、COUNT( * ) 流程 ( 于 sub_select 函数中 )
2.3、行可见性及 row_search_mvcc 函数
2.4、evaluate_join_record 与列是否为空
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
数据结构
MyISAM 全表 COUNT(*)
几个问题
共性:共性存在于 SQL 层,即 SQL 解析之后的数据结构是一致的,count 变量都是存在于作为结果列的 Item_sum_count 类型对象中;返回给客户端的过程也类似 – 对该 count 变量进行赋值并经由 MySQL 通信协议返回给客户端。 区别:InnoDB 的 count 值计算是在 SQL 执行阶段进行的;而 MyISAM 表本身在内存中有一份包含了表 row_count 值的 meta 信息,在 SQL 优化阶段通过存储引擎的标记给优化器一个 hint,表明该表所用的存储引擎保存了精确行数,可以直接获取到,无需再进入执行器
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。