MySQL学习笔记(十三)count(*),count(id),count(1),count(字段)区别

news2024/9/22 1:41:18

count

count 是MySQL的一个查询数量统计的函数,我们在平常的工作中经常会用到,count(*),count(id),count(1),count(字段)这4种写法有什么区别呢?

//星号
select count(*) from user;
//常数
select count(1) from user;
//id(主键)
select count(id) from user;
//字段
select count(name) from user;

这几种方式都可以查询出user表的个数,但是结果可能会不一样,为什么呢?

思考

为什么《阿里巴巴Java开发手册》中强制要求不让使用 COUNT(列名)或 COUNT(常量)来替代COUNT(*)呢?

在这里插入图片描述

因为count(*)是SQL92定义的标准统计行数的语法,

所以MySQL对他进行了很多优化,MyISAM中会直接把表的总行数单独记录下来供count(*)查询,而InnoDB则会在扫表的时候选择最小的索引来降低成本。当然,这些优化的前提都是没有进行where和group的条件查询。

count执行过程

根据mysql执行引擎的不同,count的执行过程也会不同,我们以count(*)为例来分别介绍二者的执行原理。

  • MyISAM引擎:这个引擎最大的特点是不支持事务,锁的话是表级锁,正是由于是表级锁,针对表的操 作都需要串联操作,不会出现两个或多个执行程序对一张表的同时操作,也就是说表的行数是稳定的,可维护的。针对count() 的操作,mysql自己了一个优化,类似于维护一份元数据信息,专门用来记录表的行数,这样每当有count()查询的时候就直接返回这个维护好的值,不需要再扫描全表了。所以它是一个O(1)复杂度的操作。

  • InnoDB引擎:支持事务支持行级锁,行级锁的特点是多个事务可以同时对一张表进行读写,只要是不 同的行就行。但是这样一来表的行数就会变化很快而不可维护,mysql本身也就无法专门维护一个值去记录表的行数了。所以针对count(*)的操作不得不扫描全表以返回一个准确的结果。这是一个O(n)复杂度的操作。

优化:虽然在InnoDB引擎下没有一个直接返回的结果,但是随着mysql版本的不断升级,官方还是做了许多优化的,主要是索引上的优化。从上面我们知道在这个引擎下不可避免的要扫描全表,所以我们也只能再扫描全面上下功夫。由于count(*)不关心具体的列,所以在扫描的过程中我们如果可以选择一个较低成本的索引的话就可以节省扫描的时间。在InnoDB中索引分为聚簇索引(主键索引)和非聚簇索引(非主键索引),聚簇索引的叶子节点中保存的是整行记录,而非聚簇索引的叶子节点中保存的是该行记录的主键的值。这种情况下是非聚簇索引要比聚簇索引小得多,所以在具体执行的过程如果有非聚簇索引的活mysql会自动选择在非聚簇索引的列上做统计,这样就能提高查询的速度。

备注:以上都是在SQL语句中没有where和group by等限定条件下的查询分析。

count(*)和count(1)的对比

首先这两者的执行结果是完全一致的,也可以把count(1)换成其他的数字如count(8)甚至是字符串如count(‘x’),都不会影响执行的结果。但是针对二者的执行过程,网上是众说纷纭,一种主流的观点是count()比count(1)快,原因是mysql针对 count( )这种操作做了特殊的优化;另外一种声音是count(1)比count()快,因为count()在执行过程中会先转为为count(1)然后在执行,直接count(1)的话少了一步转换操作,自然会快一些。那么哪种说更有道理呢?我们还是来看官方的说明:

在这里插入图片描述
意思就是说对于InnoDB引擎来说count(*)和count(1)的底层操作是一致,在优化上是一致的,没有差异。所以结论就是二者的执行速度是一眼的,不存在孰优孰劣的差异。

不过对于MyISAM引擎来说,只有第一列的值全部不为null的时候,count(1)才和count(*)拥有相同的执行优化。

count(id)和count(字段)的对比

查id 和查字段实际上是一样的,都会查询出非空数据,并累加1,但是由于id是主键非空的,所以count(id) 的效率比count(字段)更快,count(字段)需要把判断是否为null

count执行结果

在这里插入图片描述

我们分别用这下列几种情况测试下

  • count(*)=5–统计全部的记录行数,包括为null的行

  • count(id)=5–按照主键统计所以行数,扫描全表统计

  • count(1)=5–统计全部的记录行数,包括为bull的行

  • count(name)=5–按照name列统计name不为null的记录行数

  • count(age)=3–按照age列统计age值不为null的记录行数

  • count(address)=3–按照address统计address不为null的记录行数

总结

  • 执行速度上:针对一般情况(SQL语句中没有where条件)执行速度上

    count(*)=count(1)>count(主键)>count(其他列),

    在没有其他特殊要求的情况下推荐大家使用count(*)来代替其他的count。

  • 执行结果上,count(*)与count(1)以及count(主键)的结果完全相同,即返回表中的所有行数,包含null 值;count(其他列)会排除掉该列值为null的记录,返回的值小于或者等于总行数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

片内总线在cpu扮演什么角色?他为什么能实现高效,不同的CPU为什么采用不同的总线协议?

文章目录各种新型片上总线维度(Degree)跳(Hop)和跳数(Hop Count,HC)直连拓扑和路由器Intel的Ring和Mesh总线双Ring结构Mesh Bus结论片上总线,也称作片上网络(Network on …

毕业设计-基于机器视觉的火灾烟雾检测识别系统-yolo

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于网络安全维护的机房设备管理19rya

对于计算机专业的学生最头疼的就是临近毕业时的毕业设计,对于如何选题,技术选型等这些问题,难道了大部分人,确实,还没毕业的学生对于这些问题还比较陌生,只有学习的理论知识,没有实战经验怎么能独自完成毕业设计这一系列的流程,今天我们就聊聊如何快速应对这一难题. 比较容易的…

LSM Tree

LSM Tree 的存储模型,包括 Tidb,HBase等 特点 通过将大量的随机写转换为顺序写,从而极大地提升了数据写入的性能,虽然与此同时牺牲了部分读的性能。 只适合存储 key 值有序且写入大于读取的数据,或者读取操作通常是…

vueX持久化存储插件

场景:我们在做vue项目时,会遇到存储一些公共值,这样方便在不同的页面去调用这些值 vue中有个vuex,一般我们都存储在这里,这样在每个页面都能够调用 但是,当页面刷新了,这些值就被自动清理掉了 这…

第七届 Sky Hackathon 笔记集合贴

Alex_McAvoy--------NVIDIA 7th SkyHackathon(二)开发套件的安装与测试 Alex_McAvoy--------NVIDIA 7th SkyHackathon(三)语音数据集的制作 Alex_McAvoy--------NVIDIA 7th SkyHackathon(四)Nemo ASR 模型训…

vue.js ES6对象字面量的增强写法

1.属性的增强写法 ES5的写法&#xff1a; 运行效果 ES6的写法&#xff1a; 运行效果 2.函数的增强写法 ES5的写法&#xff1a; ES6的写法&#xff1a; 完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"…

基于Javamail的邮件收发系统(系统+论文+开题报告+任务书+外文翻译+文献综述+答辩PPT)

毕业设计&#xff08;论文&#xff09; &#xff08; 20 届&#xff09; 论文&#xff08;设计&#xff09;题目 基于Javamail的邮件收发系统 作 者 二级学院、专业 班 级 指导教师&#xff08;职称&#xff09; 论 文 字 数 论文完成时间 20年月日 基于JavaMail的邮件…

169-Rust和Solana环境配置

之前写过一篇Rust和Solana环境配置的 应该说写得是非常非常好 并不是说博文写得好 而是说写得非常非常的必要 比如我现在就是想要搞Rust和Solana配置 但是好久好久没搞了 已经完全忘记了 看到那一篇博文的时候就感觉想起来了很多 如果可以参考那篇完整做下来的话 就会…

是时候展示给大家这5款压箱底的软件了

是时候把自己压箱底的软件都发出来了&#xff0c;软件都是小巧耐用&#xff0c;不带广告的&#xff0c;赶紧下载起来吧&#xff01;就算暂时用不到的&#xff0c;也可以收藏起来等需要的时候再来下载&#xff01; 1.PPT演示——Focusky 一个高效的动画 PPT 演示软件&#xff0…

Linux学习-71-GRUB手动安装方法

16.13 GRUB手动安装方法 需要手工安装 GRUB 主要有两种情况&#xff1a; Linux 系统原先不是使用 GRUB 作为引导程序而现在想要使用 GRUB 来作为引导程序&#xff1b;MBR 中的引导程序被覆盖&#xff0c;需要在 MBR 中重新安装 GRUB&#xff0c;如先安装了 Linux 系统&#xf…

主成分分析的基本原理

目录 什么是主成分分析&#xff1f; 主成分分析的步骤 根据什么选择主成分&#xff1f; 怎样解释主成分&#xff1f; 特征值、方差解释率及碎石图 载荷系数与共同度 什么是主成分分析&#xff1f; 主成分的概念由Karl Pearson在1901年提出的。他是考察多个 变量间相关性…

Qt扫盲-Qt Creator IDE使用总结

Qt Creator IDE使用总结一、欢迎页1. 最近项目2. 示例3. 教程二、编辑页1. 左侧菜单区1. 工具栏2. 项目目录常用操作介绍1. 项目名2. 中间编码区1.顶部工具区2.编码区的常用功能1. 文件操作2. 类的一些方便操作1、Follow Symbol Under Cursor2. 查找和替换3. Refactor4. F1帮助…

AP1236 线性LDO稳压IC 工作原理图分享

深圳世微半导体有限公司&#xff0c;专业研发DC/DC降压恒流车灯IC&#xff0c;我们有一流的研发团队&#xff0c;良好的服务&#xff0c;做一流品质的产品&#xff0c;所有产品均提供配套方案和技术支持 供应多种DC/DC降压恒流方案选型表&#xff1a; AP5160 外置MOS电流20MA-…

构造一个m行n列的二维数组(mln的取值均小于等于4, mln均由键盘输入),并由键盘输入数组元素的值,并且按照矩阵的形式输出

构造一个m行n列的二维数组(mln的取值均小于等于4&#xff0c; mln均由键盘输入),并由键盘输入数组元素的值&#xff0c;并且按照矩阵的形式输出 Scanner sc new Scanner(System.in); System.out.println("请输入行"); int m sc.nextInt(); System.out.println(&quo…

【Java】阿拉伯数字转汉字(完全符合中文阅读习惯)(支持所有整数类型)

Java 阿拉伯数字转汉字 网上看过很多实现&#xff0c;但都有 BUG&#xff0c;不是多余0没有处理&#xff0c;就是很多生成的汉字字符串根本不符合中文阅读习惯&#xff08;各位代码写完测试的时候用例多搞一点啊&#xff09; 刚好公司有个项目就要实现这个小功能&#xff0c;…

Python爬虫实战,requests+parsel模块,爬取二手房房源信息数据

前言 最近在尝试用Python爬虫二手房房源信息数据&#xff0c;在这里给需要的小伙伴们提供代码&#xff0c;并且给出一点小心得。 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫&#xff0c;基本的是加请求头&#xff0c;但是这样的纯文本数据爬取的人会很多&…

关于chatGPT对有关Docker Desktop问题的一个回答

1、关于chatGPT 最近用https://github.com/Hitachi-Automotive-And-Industry-Lab/semantic-segmentation-editor的基于React的web端数据标记工具&#xff0c;挺好用。 但发现即便删除了container&#xff0c;之前标注的label都还在&#xff0c;觉得很奇怪&#xff0c;因为mon…

添加组件 页面上找一些功能组件直接用(比如layui)

layDate - JS 日期和时间选择器组件/插件 - 在线演示 - Layui 比如&#xff0c;我想添加一个日期的组件&#xff0c;我现在上面页面找 1.先找到日期与时间选择组件 2.找到你想要的组件 3.点击查看代码&#xff0c;找到组件代码的位置 在页面中添加上&#xff1a; <div cl…

你需要偷偷珍藏的java兼职平台

兼职在现在来说&#xff0c;应该不算什么非常罕见的事情。如果你感觉java技术还可以再练练手&#xff0c;或者想在闲暇的时间赚一点外快。那下面这些Java兼职平台&#xff0c;你一定要收藏。 1&#xff0c;程序员客栈 老实说&#xff0c;当时我使用这个平台&#xff0c;一个原…