都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中元件重叠放置时,如何消除报错
912 0
|
8月前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
1339 9
|
负载均衡 监控 Dubbo
秒懂Dubbo接口(原理篇)
【4月更文挑战第25天】秒懂Dubbo接口(原理篇)
748 3
秒懂Dubbo接口(原理篇)
|
存储 关系型数据库 MySQL
mysql优化指南之优化篇
mysql优化的一些方法
1520 1
|
机器学习/深度学习 数据采集 监控
探索机器学习中的数据偏见及其影响
在机器学习领域,数据偏见是一个日益受到关注的问题。本文通过分析数据偏见的来源、表现和对模型性能的影响,旨在揭示如何识别和减少这种偏见。文章首先定义了数据偏见并探讨了其产生的原因,接着通过案例分析了偏见对模型决策的具体影响,最后提出了几种减轻数据偏见的策略。研究指出,虽然完全消除数据偏见是极其困难的,但通过合理的数据处理和算法设计可以显著降低其负面影响。
|
安全 Python
详解module ‘yaml‘ has no attribute ‘FullLoader‘
遇到“module 'yaml' has no attribute 'FullLoader'”错误时,首先应该确认你正在使用的PyYAML库的版本至少是5.1,并确保已经正确地导入了PyYAML。紧随其后,考虑使用 `safe_load()`作为读取YAML文件的更安全方式。通过采取这些解决措施,你应该能够有效地解决这个问题,使你的代码能够顺利地读取YAML文件。
316 2
|
关系型数据库 MySQL Linux
Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(报错已解决)
Docker安装mysql详细教程, mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory) 已解决
|
Kubernetes 负载均衡 网络协议
在K8S中,Pod能否实现对容器健康检查,如果服务有异常,该如何处理?
在K8S中,Pod能否实现对容器健康检查,如果服务有异常,该如何处理?
|
JavaScript 前端开发 IDE
TypeScript中的声明文件(.d.ts):扩展类型系统
TypeScript的`.d.ts`声明文件为JS库提供类型信息,增强IDE支持,如自动完成和类型检查。通过声明合并,可在全局作用域定义类型。示例包括为`my-library`创建声明模块,导出函数和接口。声明文件通常存于`@types`或指定`typeRoots`。用于旧JS代码的类型注解,如`myGlobalObject`。学习更多,参阅TypeScript官方文档。分享你的TS声明文件经验!
441 1
|
监控 安全 Java
ElasticSearch在Windows上的下载与安装
ElasticSearch在Windows上的下载与安装