当前位置: 首页 > news >正文

都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)。

我建了一个公众号【鱼仔ly】,每日更新java基础、源码、项目,我们一起冲大厂!

相关文章:

  • Linux下PF_PACKET的使用,RARP的server和client程序
  • 面试官:不会真有人不知道什么是线程池吧?
  • 从零搭建基于SpringBoot的秒杀系统(一):项目准备
  • 【总结】oracle恢复误删除数据,解除锁定的等sql语句
  • 从零搭建基于SpringBoot的秒杀系统(二):快速搭建一个SpringBoot项目
  • 重拾cgi——cgi dispatcher
  • 从零搭建基于SpringBoot的秒杀系统(三):首页、详情页编写
  • 从零搭建基于SpringBoot的秒杀系统(四):雪花算法生成订单号以及抢购功能实现
  • 操作系统实验一 命令解释程序的编写
  • 从零搭建基于SpringBoot的秒杀系统(五):基于Shiro的人员登陆认证
  • 从零搭建基于SpringBoot的秒杀系统(六):使用RabbitMQ让订单指定时间后失效
  • 从零搭建基于SpringBoot的秒杀系统(七):高并发导致超卖问题分析处理
  • 从零搭建基于SpringBoot的秒杀系统(八):通过分布式锁解决多线程导致的问题
  • 读《世界是数字的》有感
  • 面试官问我:什么是静态代理?什么是动态代理?注解、反射你会吗?
  • hexo+github搭建个人博客
  • 230. Kth Smallest Element in a BST
  • CentOS从零开始部署Nodejs项目
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JAVA 学习IO流
  • JS+CSS实现数字滚动
  • LeetCode算法系列_0891_子序列宽度之和
  • QQ浏览器x5内核的兼容性问题
  • Rancher-k8s加速安装文档
  • V4L2视频输入框架概述
  • vue 个人积累(使用工具,组件)
  • 关于使用markdown的方法(引自CSDN教程)
  • 时间复杂度与空间复杂度分析
  • 王永庆:技术创新改变教育未来
  • 用mpvue开发微信小程序
  • 与 ConTeXt MkIV 官方文档的接驳
  • 在Unity中实现一个简单的消息管理器
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​Spring Boot 分片上传文件
  • %@ page import=%的用法
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (简单) HDU 2612 Find a way,BFS。
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .Net Memory Profiler的使用举例
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • // an array of int
  • /proc/stat文件详解(翻译)
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @SuppressWarnings(unchecked)代码的作用
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [\u4e00-\u9fa5] //匹配中文字符
  • [2018-01-08] Python强化周的第一天
  • [Android Pro] AndroidX重构和映射
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [BZOJ1008][HNOI2008]越狱
  • [C++]——带你学习类和对象