MySQL面试题(1):count
InnoDB 和 MyISAM 的 count(*) 有何不同
- MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数(无where条件)
- InnoDB 执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数
为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢?
因为即使是在同一个时刻的多个查询,由于多版本并发控制(MVCC)的原因,InnoDB 表“应该返回多少行”也是不确定的。
InnoDB count(*)、count(主键 id)、count(字段) 和 count(1) 这几个用法的性能差别,为什么
- count(字段)<count(主键 id)<count(1)≈count(*)
- count(*) 专门做了优化,不取值。
- count(1) 不取值。server 层对于返回的每一行,放一个数字“1”进去
- 对于 count(主键 id) 来说,InnoDB 引擎会把每一行的 id 值都取出来,返回给 server 层。server 层按行累加。
- 对于 count(字段) 来说,需要先判断字段是否可以为空,再判断值是否为空
count(*) 操作 innoDB 做了哪些优化
B+树只有叶子结点上有数据,全部遍历其实就是对叶子结点的链表进行遍历。此时如果遍历主键索引树,由于其叶子结点上存放的是完整的行信息,对于一个数据页而言其行密度会比较小,最终导致要扫描的数据页较多,进而IO开销也比较大。如果遍历第二索引树,其叶子结点只存放主键信息,其数据页的行密度比较大,最终扫描的数据页较少,节省了IO开销。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了