先看看COUNT(*)
,MyISAM 引擎会把一个表的总行数记录了下来,所以在执行 COUNT(*)
的时候会直接返回数量,执行效率很高。对于InnoDB这样的事务性存储引擎, 因为增加了版本控制(MVCC)的原因,同时有多个事务访问数据并且有更新操作的时候,每个事务需要维护自己的可见性,那么每个事务查询到的行数也是不同的,所以不能缓存具体的行数,他每次都需要count计算一下所有的行数。
如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/
至于 COUNT(1) 和 COUNT(*)有什么区别呢,根据官网的内容(即上述截图倒数第二段),两种实现上其实一样:
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
因为COUNT(*)
不care返回值是否为空都会将改行纳入计算,所以他count了所有行数,而 COUNT(1)
中的 1 ,则是遇到了行的时候为恒真表达式,所以 COUNT(*)
还是 COUNT(1) 都是对所有的结果集进行 count,他们本质上没有什么区别。姑且认为 COUNT(*)≈ COUNT(1)。
关于COUNT(字段)
我们再来看看的C 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项