mysql count(*)、count(1)、count(主键id)、count(字段)的区别

news/2024/7/27 8:03:57/文章来源:https://blog.csdn.net/qq_43539664/article/details/136711837

以下讨论是基于InnoDB存储引擎,这也是mysql默认的存储引擎。

count 函数的语义

要想弄清楚count(*)、count(1)、count(主键id)、count(字段)的区别,需要弄清楚count函数的语言,该函数拿到传进来的参数后,会一行一行地遍历结果返回集,如果某行参数不为Null,就累计计数加1,如果某行参数为Null,就跳过。count(字段)就会判断该行的某个字段是否Null来决定累计计数是否加1

分析性能差异时遵守的原则

在分析count(*)、count(1)、count(主键id)、count(字段)的性能区别时,遵守以下几个原则:

  • server层要什么就给什么
  • InnoDB只给必要的值
  • mysql优化器只对count(*)语句做了优化

不同count参数执行过程

count(主键id)

mysql server层执行器调用 count(主键id),InnoDB存储引擎发现server层需要的是主键id。于是,InnoDB会遍历整张表,把每一行的主键id都取出来,返回给server层。server层执行器拿到主键id后,判断其是否为空,不为空,累计计数加1。注意:主键是不允许为空的,所以累计计数一定会加1,这是显而易见的,但是server层还是要判断一下

count(1)

mysql server层执行器调用 count(1),InnoDB存储引擎发现server层需要的是1。于是,InnoDB会遍历整张表,把每一行取出来,但是不取任何值,而是把该行返回给server层。server层对于返回的每一行,放一个数字"1"进去,然后判断1是不是为空,不为空累计计数就加1.注意:server层放一个数字1,1一定是不为空,这是显而易见的,但是server层还是要判断一下1是否为空

count(字段)

mysql server层执行器调用 count(字段),InnoDB存储引擎发现server层需要的是某个字段。于是,InnoDB会遍历整张表,把每一行的目标字段都取出来,返回给server层。server层执行器拿到目标字段后,判断其是否为空,不为空,累计计数加1。注意:如果目标字段在定义的时候不允许为空的话,在用该count(字段)时累计计数一定会加1,这是显而易见的,但是server层还是要判断一下

count(*)

mysql对count()语句做了专门的优化,InnoDB看到是count(*),并不会取值,而是按行累加。应为count()就是按行累计,这是显而易见的。

为什么count(1)、count(主键id),count(非空字段)按行累加是显而易见的,但mysql却没有优化它们?

因为这种专门优化的情况太多了,而且mysql已经优化过count(*)了,你直接使用就行了。

结论

按照效率排序:count(字段)<count(主键id)<count(1)<count(*)。
所以尽量使用count(*)

为什么count(主键id)<count(1)?

因为count(主键id)涉及到解析行数据,拷贝字段。而count(1)直接返回行,所以count(1)效率更快

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精英荟萃,共话未来 | GAS 2024完整议程揭晓!

GAS 2024即将启幕&#xff01; 精彩议程&#xff0c;立即揭晓&#xff01; *最终大会议程以现场公告为准 后续将陆续揭秘更多大会议程、嘉宾名单&#xff01; 请持续关注&#xff01; 2024中国国际音频产业大会(GAS) 点击链接&#xff1a;https://appkTQS9RSU4386.h5.xiaoek…

PFA容量瓶volumetric flask应用研究分析

容量瓶是一个透明的长颈瓶&#xff0c;瓶体为梨形&#xff0c;便于摇荡液体和刷洗。每一个PFA容量瓶上的刻度线都是用千分之一的电子天平称量、标注&#xff0c;PFA容量瓶以其优异的耐化学腐蚀性和热稳定性&#xff0c;在实验室器皿中占有重要地位。随着科学技术的不断发展&…

【牛客】VL68 同步FIFO

描述 请设计带有空满信号的同步FIFO&#xff0c;FIFO的深度和宽度可配置。双口RAM的参考代码和接口信号已给出&#xff0c;请在答案中添加并例化此部分代码。 电路的接口如下图所示。端口说明如下表。 接口电路图如下&#xff1a; 双口RAM端口说明&#xff1a; 端口名I/O描述…

StarCoder 2:GitHub Copilot本地开源LLM替代方案

GitHub CoPilot拥有超过130万付费用户&#xff0c;部署在5万多个组织中&#xff0c;是世界上部署最广泛的人工智能开发工具。使用LLM进行编程辅助工作不仅提高了生产力&#xff0c;而且正在永久性地改变数字原住民开发软件的方式&#xff0c;我也是它的付费用户之一。 低代码/…

【QT】解决Ubuntu20.04下QT5.12.0连接mysql8.0失败问题。【特详细,解决不了来找我】

Ubuntu-Qt5.12.0连接mysql8.0 环境&#xff1a; 1.Ubuntu 20.04 LTS 2.Qt5.12.0 mysql安装流程&#xff1a; sudo apt-get install mysql-server mysql-client sudo apt-get install libqt5sql5-mysql sudo apt-get install libmysqlclient20 sudo apt-get install libmysq…

金现代产品方案部部长王宁,将出席“ISIG-低代码/零代码技术与应用发展峰会”

3月16日&#xff0c;第四届「ISIG中国产业智能大会」将在上海中庚聚龙酒店拉开序幕。本届大会由苏州市金融科技协会指导&#xff0c;企智未来科技&#xff08;LowCode低码时代、RPA中国、AIGC开放社区&#xff09;主办。大会旨在聚合每一位产业成员的力量&#xff0c;深入探索低…

数据结构与算法--算法和算法分析

算法与数据结构之间存在密不可分的关系。简单来说&#xff0c;数据结构是存储和组织数据的方式&#xff0c;而算法则是操作和处理这些数据的方法。 首先&#xff0c;数据结构为算法提供了基础。算法是解决问题的步骤和流程&#xff0c;通过对数据结构进行操作&#xff0c;算法可…

Day30:安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

目录 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF题目&源码审计 开发指南-NodeJS-安全SecGuide项目 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&…

《计算机网络》考研:2024/3/8 2.1.5-编码与调制(1)、2.1.6-编码与调制(2)

2024/3/8 2.1.5、2.1.6 编码与调制&#xff08;1&#xff09; 编码与调制&#xff08;2&#xff09; (据老师所解释&#xff0c;曼彻斯特编码在每个时钟周期内&#xff0c;开始时的信号也变换了一次&#xff0c;加上中间变换一次&#xff0c;因此每个周期内会变换两次。)

go切片实现原理

近日一直在学习golang,已经产出如下博客一篇 GO闭包实现原理(汇编级讲解) 引言 最近在使用go语言的切片时,出现了一些意料之外的情况,遂查询相关文档学习后写下此篇博客 正文 首先,我们思考,go在通过函数传递一个切片时,是通过引用传递的吗,还是通过值传递的呢(答案将会很…

pgsql常用索引简写

文章来源&#xff1a;互联网博客文章&#xff0c;后续有时间再来细化整理。 在数据库查询中&#xff0c;合理的使用索引&#xff0c;可以极大提升数据库查询效率&#xff0c;充分利用系统资源。这个随着数据量的增加得到提升&#xff0c;越大越明显&#xff0c;也和业务线有关…

进程等待详解

一、进程等待的作用 我们都知道&#xff0c;当子进程已经结束而父进程还在执行时&#xff0c;子进程会变成僵尸进程&#xff0c;造成内存泄漏等问题&#xff0c;如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include &l…

2024/3/11打卡分巧克力(第8届蓝桥杯省赛)——二分

题目 儿童节那天有 K 位小朋友到小明家做客。 小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N 块巧克力&#xff0c;其中第 i 块是 HiWi 的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。 切出的巧克力需要满足&…

面试题:Redis 为什么读写性能高?

Redis 的速度⾮常快&#xff0c;单机的 Redis 就可以⽀撑每秒十几万的并发&#xff0c;性能是 MySQL 的⼏⼗倍。速度快的原因主要有⼏点&#xff1a; 基于内存的数据存储 Redis 将数据存储在内存当中&#xff0c;使得数据的读写操作避开了磁盘 I/O。而内存的访问速度远超硬盘&a…

数据处理分类、数据仓库产生原因

个人看书学习心得及日常复习思考记录&#xff0c;个人随笔。 数据处理分类 操作型数据处理&#xff08;基础&#xff09; 操作型数据处理主要完成数据的收集、整理、存储、查询和增删改操作等&#xff0c;主要由一般工作人员和基层管理人员完成。 联机事务处理系统&#xff…

opengl日记27-opengl报错ERROR::SHADER::PROGRAM::LINKING_FAILED

Author: wencoo Blog&#xff1a;https://wencoo.blog.csdn.net/ Date: 14/03/2024 Email: jianwen056aliyun.com Wechat&#xff1a;wencoo824 QQ&#xff1a;1419440391 Details:文章目录 目录正文 或 背景 报错信息ERROR::SHADER::PROGRAM::LINKING_FAILED解决方法情况1情况…

SpringController返回值和异常自动包装

今天遇到一个需求&#xff0c;在不改动原系统代码的情况下。将Controller的返回值和异常包装到一个统一的返回对象中去。 例如原系统的接口 public String myIp(ApiIgnore HttpServletRequest request);返回的只是一个IP字符串"0:0:0:0:0:0:0:1"&#xff0c;目前接口…

PandasAI—让AI做数据分析

安装 pip install pandasai !pip install --upgrade pandas pandasai 导入依赖项 import pandas as pdfrom pandasai import PandasAIfrom pandasai.llm.openai import OpenAI使用pandas创建一个数据框 df pd.DataFrame({"country": ["United States",…

如何解决ChatGPT消息发不出问题,GPT消息无法发出去,没有响应的问题

前言 今天工作到一半&#xff0c;登陆ChatGPT想咨询一些代码上的问题&#xff0c;结果发现发不了消息了。 ChatGPT 无法发送消息&#xff0c;但是能查看历史的对话。不过首先可以先打开官方的网站&#xff1a;https://status.openai.com/ 。 查看当前Open AI的状态&#xff0…

运放失调电压及其影响

运放失调电压及其影响 在运放的应用中&#xff0c;我们经常会遇到一个重要的性能指标——失调电压。本文将介绍失调电压的定义、优劣范围&#xff0c;并提供一些应对失调电压的方法。 定义 在运放开环使用时&#xff0c;加载在两个输入端之间的直流电压使得放大器直流输出电…