MySql-count(*)与count(id)与count(字段)之间的执行结果和性能分析
在mysql数据库中,当我们需要统计数据的时候,一定会用到count()这个方法,那么count(值)里面的这个值,到底应该怎么选择呢!常见有3种选择,(*,数字,列名),分别列出它们的执行结果和性能对比。
执行效果:
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是指空字符串或者0,而是null)的计数,即某个字段值为NULL时,不统计。
测试结果:
1 CREATE TABLE `test_count` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `phone` varchar(11) DEFAULT NULL, 4 `nick_name` varchar(50) DEFAULT NULL, 5 `username` varchar(50) DEFAULT NULL, 6 `password` varchar(50) DEFAULT NULL, 7 `gender` tinyint(1) DEFAULT NULL, 8 `is_del` tinyint(1) DEFAULT NULL, 9 PRIMARY KEY (`id`), 10 KEY `index_username` (`username`) USING BTREE 11 ) ENGINE=InnoDB AUTO_INCREMENT=17805 DEFAULT CHARSET=utf8;
1 [SQL] SELECT COUNT(*) FROM test_count; 2 受影响的行: 0 3 时间: 0.828ms 4 5 [SQL] 6 SELECT COUNT(1) FROM test_count; 7 受影响的行: 0 8 时间: 0.827ms 9 10 [SQL] 11 SELECT COUNT(id) FROM test_count; 12 受影响的行: 0 13 时间: 0.873ms 14 15 [SQL] 16 SELECT COUNT(username) FROM test_count; 17 受影响的行: 0 18 时间: 0.981ms 19 20 [SQL] 21 SELECT COUNT(nick_name) FROM test_count; 22 受影响的行: 0 23 时间: 7.673ms
在100W+数据下,count(*)和count(1)差距微乎其微,但两者效率大于count(id),count(id)效率明显大于count(column),带索引的count(column)明显效率高于不带索引的。
最终结论:
count(1) > count(*) > count(主键id) > count(带索引column) > count(不带索引column),count(1)效率稍微高于count(*),但差距微乎其微。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端