MySQL COUNT(*)、COUNT(1)、COUNT(id)、COUNT(字段)效果及性能
文章目录
- 前言
- COUNT(exper)
- COUNT(*)
- 优化
- COUNT(*) 与COUNT(1)
- COUNT(1)
- COUNT(id)
- COUNT(字段)
- 总结
- 参考
前言
业务开发中,我们经常要使用count做一些数据统计。今天根据MySQL5.7官方文档及丁奇老师的MySQL45讲,介绍一下COUNT(*)、COUNT(1)、COUNT(id)、COUNT(字段)效果及性能。
COUNT(exper)
COUNT(exper) 返回由 SELECT 语句检索到的行中,expr 非 NULL 值的数量,结果是一个 BIGINT 类型的值。如果没有匹配的行,结果为0。
COUNT(*)
COUNT(*)它返回的是检索到的行数,无论这些行是否包含 NULL 值。
那么问题来了,如果SQL中没有WHERE条件,只是统计一个总数,MySQL为啥不弄总行数计数器?需要时直接返回,效率肯定高。没错,MyISAM引擎就是这做的,它把一个表的总行数存在了磁盘上,因此执行COUNT(*)的时候会直接返回。
但InnoDB却不能这样做,官方也给出了原因:
对于事务性存储引擎,如InnoDB,存储一个精确的行数会有问题的。如果同时发生多个事务,每个事务看到的总行数应该是不同的。SELECT COUNT(*) 语句只会计算当前事务可见的行数。存储一个精确的行,结果都相同了,不能保证事务的隔离性了!
优化
在 MySQL 5.7.18 之前,InnoDB 通过扫描聚集索引来处理 SELECT COUNT(*) 语句。从 MySQL 5.7.18 开始,除非索引或优化器提示指定了使用不同的索引,否则 InnoDB 会通过遍历最小的可用二级索引来处理 SELECT COUNT(*) 语句。如果不存在二级索引,则会扫描聚集索引。
这是因为聚集索引(或叫主键索引)叶子节点存储的是数据,而二级索引(或叫普通索引)存储的是主键。二级索引的树磁盘空间是要小于主键索引的,遍历需要时间更短。
这里提一下,索引字段值为null的情况。在MySQL的InnoDB存储引擎中,对于索引中的NULL值处理方式是将所有具有相同NULL值的记录放在索引树的同一位置,但并不是说所有的NULL值只占用一个节点。实际上,每个包含NULL值的记录都会在索引中有自己的条目,这些条目会聚集在一起。
COUNT(*) 与COUNT(1)
二者在操作上是一样的,无性能差异。但是前文中提到,COUNT(*)有优化,所以COUNT(*)应该略快于COUNT(1)
COUNT(1)
InnoDB引擎遍历整张表,但不取值。对于返回的每一行,放一个
数字“1”进去,判断这个值不可能为null,累加,返回总数。
COUNT(id)
InnoDB引擎会遍历整张表,取出每一行的id,判断这个值不可能为null,累加,返回总数。
count(1)不需要取值,count(id)需要取值,所以count(1)执行得要比count(主键id)快
COUNT(字段)
如果字段定义为NOT NULL。从每一行记录里读出这个字段不会为空,直接按行累加,返回总数。
如果字段定义为 可为NULL。从每一行记录里读出这个字段值可能为空,需要取出这个字段值,判断是否为空,不为空就累加。
总结
- 效果上 COUNT(*)=COUNT(1)=COUNT(id),都是统计满足条件的总行数,不考虑是否为null。COUNT(字段)是要考虑是否为空。
- 性能上 COUNT(*)>COUNT(1)>COUNT(id)>COUNT(字段)
- 能用COUNT(*)就用COUNT(*)
个人感觉,COUNT(1)和COUNT(id)没有存在必要,可以放弃掉,这样简单一点,哈哈哈哈哈哈
!
参考
MySQL5.7官方文档
相关文章:
MySQL COUNT(*)、COUNT(1)、COUNT(id)、COUNT(字段)效果及性能
文章目录 前言COUNT(exper)COUNT(*)优化COUNT(*) 与COUNT(1) COUNT(1)COUNT(id)COUNT(字段)总结参考 前言 业务开发中,我们经常要使用count做一些数据统计。今天根据MySQL5.7官方文档及丁奇老师的MySQL45讲,介绍一下COUNT(*)、COUNT(1)、COUNT(id)、COU…...
webpack4 - 动态导入文件 dynamic-import 报错的解决方法
介绍 webpack4动态导入文件报错,按照错误提示安装了插件,但未果。。 最后查到一个可行方案,记录如下。 1.通过懒加载的方式动态引入文件 const router new Router({routes: [{path: /home,name: Home,component: () >import(./views/h…...
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (四):状态码的使用
本项目旨在学习如何快速使用 nodejs 开发后端api,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师) 由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序࿰…...
springboot061基于B2B平台的医疗病历交互系统(论文+源码)_kaic
摘 要 进入21世纪,计算机技术迅速向着网络化的、集成化方向发展。传统的单机版应用软件正在逐渐退出舞台,取而代之的是支持网络、支持多种数据信息的新一代网络版应用软件,形成了信息化的社会。信息化社会的形成和微电子技术日新月异的发展&…...
基于FFT + CNN -Transformer时域、频域特征融合的电能质量扰动识别模型
往期精彩内容: Python-电能质量扰动信号数据介绍与分类-CSDN博客 Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类-CSDN博客 Python电能质量扰动信号分类(三)基于Transformer的一…...
JAVA开发环境:IntelliJ IDEA、Java JDK、Maven 安装配置
一、安装IntelliJ IDEA 准备安装包 通过百度网盘分享的文件:idea2023.2U**.zip 链接:https://pan.baidu.com/s/1NB04A-jMXhZKsewYshGt-Q 提取码:oeft 安装 IntelliJ IDEA (1)、解压,安装文件如下&#…...
鸿蒙软件开发中常见的如何快速自动生成二维码?QRCode组件
QRCode 用于显示单个二维码的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 二维码组件的像素点数量与内容有关,当组件尺寸过小时,可能出现无法展示内容的情况&…...
鸿蒙HarmonyOS NEXT 5.0开发(2)—— ArkUI布局组件
文章目录 布局Column:从上往下的布局Row:从左往右的布局Stack:堆叠布局Flex:自动换行或列 组件Swiper各种选择组件 华为官方教程B站视频教程 布局 主轴和交叉轴的概念: 对于Column布局而言,主轴是垂直方…...
【openGauss】OPENGAUSS/POSTGRESQL 中float类型到int类型的隐式转换
下面这条sql在oracle和POSTGRESQL/OPENGAUSS中的查询结果不一致 select cast(cast(0.5 as float) as integer);在oracle中返回1,在openGauss中返回0,咋一看好像是openGauss中使用了截断的方式,但是如果执行 select cast(cast(1.5 as float) as integ…...
Docker:安装 Syslog-ng 的技术指南
1、简述 Syslog-ng 是一种流行的日志管理工具,能够集中处理和分析日志。通过 Docker 安装 Syslog-ng 可以简化部署和管理过程。本文将介绍如何使用 Docker 安装 Syslog-ng,并提供一个 Java 示例来展示如何将日志发送到 Syslog-ng。 2、安装 2.1 创建…...
即插即用的3D神经元注意算法!
本文所涉及所有资源均在 传知代码平台 可获取。 目录 3D神经元注意力:为每一个神经元分配权重!(算法) 一、概述 二、研究背景 三、主要贡献 四、模型结构和代码 五、数据集介绍 六、性能展示 六、复现过程 七、运行过程 SimAM总结…...
FPGA 蜂鸣器 音乐播放器
点击: FPGA 蜂鸣器音乐播放器 基于FPGA的beep音乐播放器设计 FPGA(Field Programmable Gate Array)蜂鸣器音乐播放器是一个将FPGA编程用于控制蜂鸣器播放音乐的设备。下面是一个简单的实现步骤和思路: 一、硬件准备 FPGA开发板…...
前端-基础CSS总结常用
1.书写位置:title 标签下方添加 style 双标签,style 标签里面书写 CSS 代码。 <title>CSS 初体验</title> <style>/* 选择器 { } */p {/* CSS 属性 */color: red;} </style><p>体验 CSS</p> <link rel="stylesheet" href=…...
Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (一)
coppelia sim[V-REP]仿真实现 机器人于3D相机手眼标定与实时视觉追踪 一 标定板的制作生成标定的PDF文件PDF转为图像格式图像加载到仿真中 二 仿真场景设置加载机器人加载的控制dummy ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b48549d355d8441d8dfc20bc7ba7196…...
CSS常见面试题
🎯CSS常见面试题 1.CSS的盒模型2.CSS选择器的优先级3.隐藏元素的方法有哪些?4.px和rem的区别是什么?5.重绘排版有什么区别?6.让一个元素水平垂直居中的方式有哪些?7.CSS的哪些属性可以继承?哪些不可以继承&…...
ChatGPT实现旅游推荐微信小程序
随着旅游行业的快速发展,个性化推荐已成为提升用户体验的重要手段。通过AI技术,提供一个智能旅游推荐小程序,使用户能够轻松获取定制化的旅行建议。 项目概述 项目目标 开发一个AI旅游推荐小程序,基于用户输入的旅行偏好&#…...
基于单片机的智能小区门禁系统设计(论文+源码)
1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心,STM32单片机作为主控单元,通过WiFi模块实现与手机APP的连接,构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…...
stm32F103 实现呼吸灯效果
目录 硬件连接 软件实现步骤 初始化系统时钟。 配置 GPIO 引脚。 配置定时器以生成 PWM 信号。 在主循环中调整 PWM 占空比以实现呼吸效果。 示例代码 1. 初始化系统时钟 2. 配置 GPIO 引脚 3. 配置定时器以生成 PWM 信号 4. 在主循环中调整 PWM 占空比以实现呼吸效…...
SAP 为 Copilot Joule 增添协作功能
在最新的SAP TechEd大会上,SAP发布了一系列创新功能,旨在扩展其AI平台Joule的能力,同时推出了其他工具,以提高企业效率并为开发人员提供更多支持。这些创新不仅将推动AI驱动的业务转型,还将加强数据的利用和简化开发流…...
Node.js 模块化
1. 介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则(规范)拆分成多个文件的过程称之为 模块化其中拆分出的 每个文件就是一个模块 ,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用 1.2 什…...
【部署篇】RabbitMq-03集群模式部署
一、准备主机 准备3台主机用于rabbitmq部署,文章中是在centos7上安装部署rabbitmq3.8通过文章中介绍的方式可以同样在centos8、centos9上部署,只需下载对应的版本进行相同的操作。 主机IP角色说明192.168.128.31种子节点192.168.128.32普通节点192.16…...
【硬啃Dash-Fastapi-Admin】03-requirements-pg.txt 速览
文章目录 dash2.18.1 纯Python的Web应用框架Python Dash库的功能介绍和用法示例功能介绍用法示例 Flask-Compress1.15 Flask响应数据的压缩功能介绍用法示例注意事项 feffery-antd-charts0.1.0rc5 数据可视化组件库功能介绍用法示例 feffery-antd-components0.3.8 Dash 第三方组…...
【CS常见问题】你用的是VS2019,最高支持.NET5.0,但是项目将.NET6.0设为目标无法运行,怎么办?
.NET版本问题 报错示例报错分析最简单的方法步骤 报错示例 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低版本设置为目标,或使用支持 .NET 6.0 的 .NET SDK 版本。 ABFview C:\x…...
系统登录接口文档Demo
接口描述 该接口用于用户登录验证。通过用户名和密码进行身份验证,成功后返回一个用于后续请求的认证 token。这个 token 是访问受保护资源的凭证。 时序图: 登录请求: 登录查询接口: POST {url}/api/user/login 请求体: {"username…...
gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件
结合 Logrus 和 Lumberjack,可以创建一个高效的日志中间件,用于记录请求和响应。以下是实现步骤: 1. 安装依赖 首先,确保安装了 Logrus 和 Lumberjack: go get github.com/sirupsen/logrus go get gopkg.in/natefin…...
kube-prometheus-stack 自定义 alertmanager 配置推送webhook
创建AlertmanagerConfig资源 在没有使用 prometheus-operator 的情况下,需要手动配置 alertmanager.yaml 来路由&发送从 prometheus 接收的警报。 使用 prometheus-operator 之后,事情变得简单一些。只需要创建 AlertmanagerConfig 资源࿰…...
openssl签名报错
在调用RSA_private_encrypt函数时遇到如下报错。 0:error:0D07803A:asn1 encoding routines:asn1_item_embed_d2i:nested asn1 error:crypto/asn1/tasn_dec.c:309:TypeX509 0:error:2406C06E:random number generator:RAND_DRBG_instantiate:error retrieving entropy:crypto/…...
如何在不使用 VPN 的情况下通过 SOCKS 隧道安全地路由 Web 流量
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 介绍 在某些情况下,您可能会发现自己处于一个不安全的网络或者有一个过于严格的防火墙,您会希望确保没有人在监…...
android openGL ES详解——缓冲区VBO/VAO/EBO/FBO
目录 一、缓冲区对象概念 二、分类 三、顶点缓冲区对象VBO 1、概念 2、为什么使用VBO 3、如何使用VBO 生成缓冲区对象 绑定缓冲区对象 输入缓冲区数据 更新缓冲区中的数据 删除缓冲区 4、VBO应用 四、顶点数组对象VAO 1、概念 2、为什么使用VAO 3、如何使用VAO…...
计算机网络——传输层服务
传输层会给段加上目标ip和目标端口号 应用层去识别报文的开始和结束...
泉州自主建站模板/武汉seo技术
https://motion-project.github.io/ 转载于:https://www.cnblogs.com/kekeoutlook/p/11464869.html...
b2b代表网站 网站功能/长沙优化网站推广
AsynTask封装了子线程,可以直接用来处理耗时操作。 AsyncTask<Params,Progress,Result>是个抽象类,使用时需要继承这个类,然后调用execute()方法。 使用三板斧:1创建AsyncTask的子类,并为三个范型Params,Progre…...
公司的网站如何建设/山西seo顾问
https://github.com/guaju/WYNews...
织梦可以做英文网站吗/seo推广软件哪个好
# GatewayWorker2.x 3.x 手册本手册适用于GatewayWorker2.x版本以及3.x版本。## GatewayWorker 手册GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等Gatew…...
大学生服务性网站建设方案/谷歌浏览器2021最新版
相同点:被覆盖(重载)的函数的函数名必须是一样的;不同点:覆盖的函数的函数参数表必须和被覆盖的函数的参数表一样,重载的函数的函数参数表必须和被重载的函数的参数表不一样.要值得提到的是,C和C对函数的解析,C一般都把函数名解析成类似__FUNCTION__,而C却是要加一个参数表的,类…...
西安学校网站建设/网络营销的特征
WebService标签 使用WebService标签,需要配置在类上,代表这是一个提供WS的服务类。 endpointInterface:定义服务抽象WebService 协定的服务端点接口的完整名称。不允许在端点上使用此成员值,该元素的值必须有WebService标签。默认…...