都2020年了,你还不知道count(1)和count(*)谁效率更高吗?

简介: 今天公司的一个需求需要统计一个数据库中表的行数有多少,二话不说当然就直接用count()这个聚合函数,以前经常听到一种说法说count(1)的效率比count(*)要高,于是测试了一下count(1)和count(*)的速度差距,发现两者的查询速度很接近,甚至count(*)要更快一些,于是就有了这篇文章。

1.count()的用法

count()聚合函数应该是我们学习数据库时最早学到的函数,主要用于查询表中数据的数量,常用的查询语句有count(*),count(字段),count(1),count(主键)。


2.count(主键)

对于count(主键)来说,会遍历所有主键取出所有的值并按行累加,因为主键不会为空,最终会返回总的行数。


3.count(字段)

对于count(字段)来说,会遍历所有该字段,如果为null则跳过,否则取出并累加,最后返回的是非null的总和。


4.count(1)

对于count(1)来说,会遍历整张表,但不取值,直接计算行数。因此count(1)的性能要高于count(主键)。和count(主键)相比,count(1)少了一个取值的动作,减少的这个取值的动作使得count(1)的效率高于count(主键)。


5.count(*)

对于count(*)来说,count(*)的用法在早期的数据库和现在的数据库中有较大的差距,在早期的数据库中,count(*)有可能会导致全表的扫描,因此效率会低。如今的数据库引擎对count(*)做了优化,比如MyIsam引擎中count(*)会直接读取一个总行数的值,因此速度是最快的,InnoDB也同样对count(*)做了优化,用类似count(1)的方式获取行数,因此count(*)效率接近count(1)。


6.总结

总的来讲,在如今的系统中,你大可放心的使用count(*),他的效率是最高的,如果你要兼容10年前的系统,那就使用count(1)。



相关文章
Altium Designer中元件重叠放置时,如何消除报错
Altium Designer中元件重叠放置时,如何消除报错
1038 0
|
10月前
|
存储 算法 安全
.NET 平台 SM2 国密算法 License 证书生成深度解析
授权证书文件的后缀通常取决于其编码格式和具体用途。本文档通过一个示例程序展示了如何在 .NET 平台上使用国密 SM2 算法生成和验证许可证(License)文件。该示例不仅详细演示了 SM2 国密算法的实际应用场景,还提供了关于如何高效处理大规模许可证文件生成任务的技术参考。通过对不同并发策略的性能测试,开发者可以更好地理解如何优化许可证生成流程,以满足高并发和大数据量的需求。 希望这段描述更清晰地传达了程序的功能和技术亮点。
1144 14
.NET 平台 SM2 国密算法 License 证书生成深度解析
|
3月前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段三:自定义 Advisor 与结构化输出实现以及对话记忆持久化开发
本文介绍如何在Spring AI中自定义Advisor实现日志记录、结构化输出、对话记忆持久化及多模态开发,结合阿里云灵积模型Qwen-Plus,提升AI应用的可维护性与功能性。
651 125
AI 超级智能体全栈项目阶段三:自定义 Advisor 与结构化输出实现以及对话记忆持久化开发
|
11月前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
1716 9
|
负载均衡 监控 Dubbo
秒懂Dubbo接口(原理篇)
【4月更文挑战第25天】秒懂Dubbo接口(原理篇)
1169 3
秒懂Dubbo接口(原理篇)
|
消息中间件 存储 Java
【干货】看看我司消息队列用啥,全网最接地气pulsar教程(含业务解耦demo源码)
本文介绍了Apache Pulsar消息队列系统的核心特性及其与其它消息队列的区别,通过Docker安装Pulsar及Pulsar Manager,并结合电商业务场景,对比了串行执行与使用Pulsar实现异步解耦的优势,最后通过Java代码示例展示了如何利用Pulsar解决实际业务问题。
1001 4
【干货】看看我司消息队列用啥,全网最接地气pulsar教程(含业务解耦demo源码)
|
存储 关系型数据库 MySQL
mysql优化指南之优化篇
mysql优化的一些方法
1973 1
|
安全 Python
详解module ‘yaml‘ has no attribute ‘FullLoader‘
遇到“module 'yaml' has no attribute 'FullLoader'”错误时,首先应该确认你正在使用的PyYAML库的版本至少是5.1,并确保已经正确地导入了PyYAML。紧随其后,考虑使用 `safe_load()`作为读取YAML文件的更安全方式。通过采取这些解决措施,你应该能够有效地解决这个问题,使你的代码能够顺利地读取YAML文件。
382 2
|
机器学习/深度学习 数据采集 监控
探索机器学习中的数据偏见及其影响
在机器学习领域,数据偏见是一个日益受到关注的问题。本文通过分析数据偏见的来源、表现和对模型性能的影响,旨在揭示如何识别和减少这种偏见。文章首先定义了数据偏见并探讨了其产生的原因,接着通过案例分析了偏见对模型决策的具体影响,最后提出了几种减轻数据偏见的策略。研究指出,虽然完全消除数据偏见是极其困难的,但通过合理的数据处理和算法设计可以显著降低其负面影响。
|
Kubernetes 负载均衡 网络协议
在K8S中,Pod能否实现对容器健康检查,如果服务有异常,该如何处理?
在K8S中,Pod能否实现对容器健康检查,如果服务有异常,该如何处理?