MySQL count(*/column)查询优化

news2024/11/25 12:15:31

count()是SQL中一个常用的聚合函数,其被用来统计记录的总数,下面通过几个示例来说明此类查询的注意事项及应用技巧。

文章目录

  • 一、count()的含义
  • 二、count()的应用技巧
    • 2.1 同时统计多列
    • 2.2 利用执行计划

一、count()的含义

count()用于统计符合条件的记录总数,但其有2种用法:count(*)和count(column)

  • count(*) 统计记录的总数
  • count(column) 统计column列不为空的记录总数

这里的概念可能和部分人的理解有些偏差,在SQL中“*”通常代表所有列,SQL会通过查询数据字典来将其解析为所有列名,而count(*)并不会这样做,它会是直接统计数量。而count(column)只有在column列不为空的情况下才与count(*)的查询结果相同,因此如果你想统计总记录数,那么直接使用count(*),count(column)的结果可能会与你想的不同。

示例:count(*)和count(column)的区别

create table test(
id int primary key auto_increment,
name varchar(32)
);
insert into test values(null, 'Vincent'), (null, null);
select * from test;

在这里插入图片描述

表中共2条记录,其中id为2的name是一个空值,查询count(*)和count(name)观察区别:

select count(*), count(name) from test;

在这里插入图片描述

二、count()的应用技巧

由于count()是一个聚合函数,因此它在统计时会扫描符合条件的所有记录,如果我们需要统计多项汇总数据,常规的SQL会一次次的扫描结果集,每次统计出一个结果,而利用一些技巧,我们可以一次扫描统计出多个汇总数据。

2.1 同时统计多列

首先改造一下测试数据,假设这是一张销售明细表,新增产品和价格列:
alter table test add product varchar(32), add price decimal(10,2);
truncate table test;
insert into test values(null,‘Vincent’, ‘Table’, 100),(null,‘Vincent’, ‘Chair’, 50),(null,‘Vincent’, ‘Chair’, 50),(null,‘Victor’, ‘Table’, 100),(null,‘Victor’, ‘Chair’, 50),(null,‘Victor’, ‘Chair’, 50),(null,‘Victor’, ‘Chair’, 50);
select * from test;
在这里插入图片描述

假设现在我有下列问题:

  • Vincent卖了几件商品?
  • Victor卖了几件商品?
  • 产品椅子总销量是多少(不分人员)?
  • 所有产品的销售总金额是多少?

由于这几个问题的分组条件都不同,无法用1个group by条件概括。按照常规思路,第1,2个问题应该是count(*)然后group by name,第三个问题应该是count(*) where product=‘Table’,最后在全表扫描一次求出sum(price),即总金额:

select name,count(*) from test group by name;
select count(*) from test where product='Chair';
select sum(price) from test;

在这里插入图片描述

虽然上面得到了4个问题的答案,但对表查询了3次,假设在生产环境这个表非常大,那么性能必然低下。稍微优化一下,我们可以用一次查询同时回答上面4个问题:

select 
count(name='Vincent' or null) Vincent的销量,
count(name='Victor' or null) Victor的销量,
count(product='Chair' or null) 椅子的总销量,
sum(price) 总销售金额
from test;

在这里插入图片描述
这里利用了count(column)不会统计null的特性,将条件转移到count()函数的内部,实现了一次扫描,多个维度统计。

2.2 利用执行计划

当表中的数据特别大,统计时间特别长,而我们需要的结果又不需要很精确时。可以通过执行计划来查看预估的数量,利用这种方式可以在不实际执行查询的结果下快速得到结果:

示例:统计表中某类数据的数量,直接通过执行计划查看,而不实际执行SQL:

explain select count(*) from test;

在这里插入图片描述
注意这种方法之适合不需要精确数字的场景,执行计划中的rows是根据统计信息估计出来的,而统计信息本来就是个采样值而且可能已经比较过时了,使用这个方法前可以先执行 analyze table tab_name; 更新一下统计信息。

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

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

相关文章

Yarn简介及Windows安装与使用指南

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

STM32使用USART发送数据包指令点亮板载LED灯

电路连接: 连接显示屏模块,显示屏的SCL在B10,SDA在B11。 程序目的: 发送LED_ON指令打开板载LED灯,发送LED_OFF关闭板载LED灯,与上一个博客不同,这个实际上是实现串口收发文本数据包。 …

flink on yarn-per job源码解析、flink on k8s介绍

Flink 架构概览–JobManager JobManager的功能主要有: 将 JobGraph 转换成 Execution Graph,最终将 Execution Graph 拿来运行Scheduler 组件负责 Task 的调度Checkpoint Coordinator 组件负责协调整个任务的 Checkpoint,包括 Checkpoint 的开始和完成通过 Actor System 与 …

【MySQL】6.MySQL主从复制和读写分离

主从复制 主从复制与读写分离 通常数据库的读/写都在同一个数据库服务器中进行; 但这样在安全性、高可用性和高并发等各个方面无法满足生产环境的实际需求; 因此,通过主从复制的方式同步数据,再通过读写分离提升数据库的并发负载…

Day54:WEB攻防-XSS跨站Cookie盗取表单劫持网络钓鱼溯源分析项目平台框架

目录 XSS跨站-攻击利用-凭据盗取 XSS跨站-攻击利用-数据提交 XSS跨站-攻击利用-flash钓鱼 XSS跨站-攻击利用-溯源综合 知识点: 1、XSS跨站-攻击利用-凭据盗取 2、XSS跨站-攻击利用-数据提交 3、XSS跨站-攻击利用-网络钓鱼 4、XSS跨站-攻击利用-溯源综合 漏洞原理…

深度学习理解及学习推荐(持续更新)

主推YouTuBe和Bilibili 深度学习博主推荐: Umar Jamil - YouTubehttps://www.youtube.com/umarjamilai StatQuest with Josh Starmer - YouTubehttps://www.youtube.com/statquest RNN Illustrated Guide to Recurrent Neural Networks: Understanding the Int…

知乎:多云架构下大模型训练,如何保障存储稳定性?

知乎,中文互联网领域领先的问答社区和原创内容平台,2011 年 1 月正式上线,月活跃用户超过 1 亿。平台的搜索和推荐服务得益于先进的 AI 算法,数百名算法工程师基于数据平台和机器学习平台进行海量数据处理和算法训练任务。 为了提…

生成式 AI 学习资源大汇总

这里汇聚了该领域的海量学习资源,从研究更新到面试技巧,从课程材料到免费课程,还有实用代码,一应俱全,是你工作流程中的得力助手! 前沿研究:每月精心筛选的最佳生成式 AI 论文列表,让…

Flink集群主节点JobManager启动分析

1.概述 JobManager 是 Flink 集群的主节点,它包含三大重要的组件: ResourceManager Flink集群的资源管理器,负责slot的管理和申请工作。 Dispatcher 负责接收客户端提交的 JobGraph,随后启动一个Jobmanager,类似 Yarn…

C#全新一代医院手术麻醉系统围术期全流程源码

目录 一、麻醉学科的起源 二、麻醉前访视与评估记录单 患者基本信息 临床诊断 患者重要器官功能及疾病情况 病人体格情况分级 手术麻醉风险评估 拟施麻醉方法及辅助措施 其他需要说明的情况 访视麻醉医师签名 访视时间 与麻醉相关的检查结果 三、手术麻醉信息系统…

蓝桥杯单片机快速开发笔记——PCF8591的DAC模拟电压输出

一、原理分析 PCF8591电压信号探测器:http://t.csdnimg.cn/R38tC IIC原理:http://t.csdnimg.cn/v4dSv IIC指令:http://t.csdnimg.cn/RY6yi HC573/HC138:http://t.csdnimg.cn/W0a0U 数码管:http://t.csdnimg.cn/kfm9Y 独…

jmeter总结之:Regular Expression Extractor元件

Regular Expression Extractor是一个后处理器元件,使用正则从服务器的响应中提取数据,并将这些数据保存到JMeter变量中,以便在后续的请求或断言中使用。在处理动态数据或验证响应中的特定信息时很有用。 添加Regular Expression Extractor元…

实时数仓之实时数仓架构(Hudi)

目前比较流行的实时数仓架构有两类,其中一类是以FlinkDoris为核心的实时数仓架构方案;另一类是以湖仓一体架构为核心的实时数仓架构方案。本文针对FlinkHudi湖仓一体架构进行介绍,这套架构的特点是可以基于一套数据完全实现Lambda架构。实时数…

20232831 2023-2024-2 《网络攻防实践》第4次作业

目录 20232831 2023-2024-2 《网络攻防实践》第4次作业1.实验内容2.实验过程(1)ARP缓存欺骗攻击(2)ICMP重定向攻击(3)SYN Flood攻击(4)TCP RST攻击(5)TCP会话…

ocr之opencv配合paddleocr提高识别率

背景1:在这篇文章编写之前使用到的工具并不是opencv,而是java原有的工具BufferedImage。但因为在使用过程中会频繁切图,放大,模糊,所以导致的jvm内存使用量巨大,分秒中都在以百兆的速度累加内存空间。这种情…

docker可视化界面 - portainer安装

目录 一、官方安装说明 二、安装portainer 2.1拉取镜像 2.2运行portainer容器 2.3登录和使用portainer 一、官方安装说明: Install PortainerChoose to install Portainer Business Edition or Portainer Community Edition.https://www.portainer.io/install…

本地部署大模型的几种工具(上-相关使用)

目录 前言 为什么本地部署 目前的工具 vllm 介绍 下载模型 安装vllm 运行 存在问题 chatglm.cpp 介绍 下载 安装 运行 命令行运行 webdemo运行 GPU推理 ollama 介绍 下载 运行 运行不同参数量的模型 存在问题 lmstudio 介绍 下载 使用 下载模型文件…

OSCP靶场--plum

OSCP靶场–plum 考点(CVE-2022-25018 linux邮箱信息收集提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.178.28 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-28 05:41 EDT Nmap scan report for 192.168.178.2…

第十二章 微服务核心(一)

一、Spring Boot 1.1 SpringBoot 构建方式 1.1.1 通过官网自动生成 进入官网:https://spring.io/,点击 Projects --> Spring Framework; 拖动滚动条到中间位置,点击 Spring Initializr 或者直接通过 https://start.spring…

【项目技术介绍篇】若依管理系统功能介绍

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…