纳尼?MySQL 中 count(*) 比 count(1) 快?
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
MySQL中count(1)与count(*)性能比较
针对MySQL中count(1)与count(*)性能差异的讨论,本文通过实践、执行计划分析和原理分析,得出结论:两者性能差别不大。本文基于InnoDB存储引擎进行讨论,MyISAM将在文末单独说明。
1. 实践
实验使用一张含有100万条数据的表进行两个统计方法的性能测试,发现执行效率相近。通过增加数据量,可以发现使用主键id进行统计会稍快一些,但差异不明显。
2. explain分析
通过explain命令分析两种统计方法的执行计划,发现前三种统计方式(包括count(1)和count(*))使用了全索引扫描,后两种使用了全表扫描。这表明使用索引的统计方式执行效率更高。
3. 原理分析
分析主键索引与普通索引的区别,主键索引的叶子节点包含数据,普通索引的叶子节点包含主键值。因此,count(1)和count(*)会选择最小的索引树进行遍历,而count(字段)可能需要进行全表扫描(如果未设置索引)。
count(*)因为优化,MySQL会直接统计记录数,而无需读取具体数据,因此性能较好。添加非主键字段的索引后,count(*)会优先使用非主键索引进行统计,进一步提升性能。
4. MyISAM引擎
对于MyISAM引擎,由于不支持事务,其select count(*)的操作会非常快,因为行数直接存储在磁盘中。相反,InnoDB由于支持事务和MVCC,需要对每一行数据进行可见性判断,因此其统计操作无法像MyISAM那样快速。
总结:InnoDB的count(1)和count(*)性能接近,而MyISAM由于其存储方式,count(*)的性能会更优。
想要了解更多内容?