美团面试官:你知道 SELECT COUNT(*) 底层究竟干了啥吗?
码农突围
共 6476字,需浏览 13分钟
·
2021-06-08 09:25
点击上方“码农突围”,马上关注 这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看
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,表明该表所用的存储引擎保存了精确行数,可以直接获取到,无需再进入执行器
- END - 最近热文
• 韦神!北大数学系韦东奕爆红!拒绝哈佛offer,留任北大! • 他是世界上最杰出程序员之一,1 个月写了个操作系统,退休后去做飞行员! • 开挂的00后!17岁「天才少女」被8所世界名校录取,最终选择MIT计算机系 • 微信沙雕功能“炸屎”上线!网友:满屏的粑粑真可爱
评论