最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,聊到了以下内容:
数据统计你怎么能用 count() 统计数据呢,count() 太慢了,要是把数据库搞垮了那不就完了么,赶紧改用 count(1),这样比较快…
有点儿好奇,难道 count(1) 的性能真的就比 count(*) 要好吗?
印象中网上有很多的文章都有过类似问题的讨论,那 MySQL 统计数据总数 count(*) 、count(1)和count(列名) 哪个性能更优呢?今天我们就来聊一聊这个问题。
count() 性能与啥相关?
在讨论问题之前,我们需要先搞明白一件事:MySQL 中 count() 的性能到底与什么相关呢?
一件东西,我们知道如何取,必定需要提前知道如何存放才行,那我们可以初步判定,count() 性能应该与存储引擎相关!
我们都知道,MySQL 常见的存储引擎有两种:MyISAM 和 InnoDB。
在这两种存储引擎下,MySQL 对于使用 count() 返回结果的流程是不一样的:
- **MyISAM引擎:**每张表的总行数是存储在磁盘上,所以当执行 count() 时,是直接从磁盘拿到这个值返回,能够快速返回。
但要是在后面加了where查询条件时,统计总数也没有像想象中那么快了。