SQL优化实战-0001:SQL查找是否存在,不要再使用count

news2024/11/27 20:58:23

image-20230106010814789

文章目录

  • 1.需求分析与普遍SQL写法
  • 2.问题分析
  • 3.优化方案
  • 4.总结
  • 5.补充
    • 5.1 还有什么时候可以使用LIMIT 1
    • 5.2 什么时候没必要使用LIMIT 1

1.需求分析与普遍SQL写法

业务代码中,需要根据一个或多个条件,查询是否存在记录而不关心有多少条记录。普遍的SQL及代码写法如下:

select count(*) from the_table_name where ...  

Java写法:

int nums = xxDao.countXxxxByXxx(params);
if( nums > 0 ){
    //当存在时,执行这里
}else{
    //当不存在时,执行这里
}

2.问题分析

采用上述SQL语句,即会去查询所有满足 where 条件的记录。而我们的需求只是判断是否存在满足where的记录,因此查询到一条又继续查找其它满足条件的记录是完全没有必要的。这对数据库的性能也会造成一定影响。

3.优化方案

优化方案:改用 LIMIT 1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了。

select 1 from the_table_name 
where ...  
limit 1

业务代码中直接判断是否非空即可:

/*
	解释为什么是判断非空:
		我们优化后的SQL语句:select 1 ... limit 1
		至多查询一条记录
			- 如果查询到了,那么返回 1,可以用Integer接收
			- 如果没有查询到,那么就是返回 null,
			  这也是为什么我们的 isExist 不能是int类型的原因
			  不能用基元类型去接收 null
			  
	而对于我们最开始提到的普遍SQL语句,为什么能用int接收呢?
		因为 select count(*) 的查询结果一定是一个 >= 0 的整数
		因此在 应用层(Java端)接收到的一定是一个整数,不会出现接收 null 的情况
*/
Integer isExist = xxDao.countXxxxByXxx(params);
if( isExist != NULL ){
    //当存在时,执行这里
}else{
    //当不存在时,执行这里
}

4.总结

根据查询条件查出来的条数越多,性能提升的越明显,在某些情况下,还可以减少联合索引的创建。

5.补充

5.1 还有什么时候可以使用LIMIT 1

针对的是会扫描全表的 SQL 语句,如果你可以确定结果集只有一条,那么加上LIMIT 1的时候,当找到一条结果的时候就不会继续扫描了,这样会加快查询速度。

5.2 什么时候没必要使用LIMIT 1

如果数据表已经对字段建立了主键索引或唯一索引,那么可以通过索引进行查询,不会全表扫描的话,就不需要加上LIMIT 1了。

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

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

相关文章

大战谷歌!微软Bing引入ChatGPT;羊了个羊高·薪招纳技术人才;Debian彻底移除Python2;GitHub今日热榜 | ShowMeAI资讯日报

👀日报合辑 | 🎡AI应用与工具大全 | 🔔公众号资料下载 | 🍩韩信子 🎡 『微软Bing』将引入 ChatGPT,与 Google 一场大战难免 微软计划2023年3月底之前推出 Bing 搜索引擎的新版本,使用 ChatGPT …

Lua中self 、自索引及其面向对象应用代码示例

一、Lua表的self标识 在lua中,表拥有一个标识:self。self类似于c中的this指针和python中的self。在lua中,提供了冒号操作符来隐藏这个参数,例如: t1 {id 1, name "panda",addr "beijing" }-…

快过年了,看我使用python制作一个灯笼的小程序

哈喽呀,最近一直在写一些关于新年的的python小东西,今天也不例外,我把那些都放到了一个专辑里面了,感兴趣的朋友们可以去看看一下哦 目录 前言 画外轮廓 画灯笼的提线 画灯笼盖 画一下各种柱子 小小的外壳来一下 其他的小装饰…

Python打包(问题记录,待解决)

引言 文章用于测试在Python3.8的版本,打包Obspy地震包,最后集成到PyQt5上。 部署或冻结应用程序是 Python 项目的重要组成部分, 这意味着捆绑所有必需的资源,以便应用程序找到它需要的一切 能够在客户端计算机上运行。 但是&…

基于Python Unet的医学影像分割系统源码,含皮肤病的数据及皮肤病分割的模型,用户输入图像,模型可以自动分割去皮肤病的区域

手把手教你用Unet做医学图像分割 我们用Unet来做医学图像分割。我们将会以皮肤病的数据作为示范,训练一个皮肤病分割的模型出来,用户输入图像,模型可以自动分割去皮肤病的区域和正常的区域。废话不多说,先上效果,左侧…

JAVA语言基础语法——JVM虚拟机默认处理异常的方式,try...catch捕获异常

1.JVM默认的处理方式 a.把异常的名称,异常原因及异常出现的位置等信息输出在了控制台 运行结果如下: b.程序停止执行,异常下面的代码不会再执行了 2.try...catch捕获异常(自己处理,捕获异常&am…

数学建模-相关性分析(Matlab)

注意:代码文件仅供参考,一定不要直接用于自己的数模论文中 国赛对于论文的查重要求非常严格,代码雷同也算作抄袭 如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231 //清风数学建模 一、基础知识 1.皮尔逊…

Qt之Json操作demo

一、JSON简介: JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON解析器和JSON库支持许多不同的编程语言,被广泛用于Internet上的数据交换格式。…

多线程高级(线程状态、线程池、volatile、原子性、并发工具)

1.线程池 1.1 线程状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢?Java中的线程 状态被定义在了java.lang.Thread.State…

Java程序:jstack

前言 如果有一天,你的Java程序长时间停顿,也许是它病了,需要用jstack拍个片子分析分析,才能诊断具体什么病症,是死锁综合征,还是死循环等其他病症,本文我们一起来学习jstack命令~ jstack 的功能…

阳康后的第一篇博客,先来几道恶心二进制编程题

目录 一、统计二进制中1的个数 二、打印整数二进制的奇数位和偶数位 三、两个整数二进制位不同个数 一、统计二进制中1的个数 这是一道牛客网OJ题,感兴趣的话可以先做一遍再看解析哦 -> 牛客网的OJ链接 注意:上面的牛客网是接口型,不需…

Vagrant管理已存在的虚拟机

起因 某天打开VirtualBox后,发现之前创建的虚拟机都没了,后将虚拟机从本地磁盘又重新导入,但是发现使用 vagrant up 会创建新的虚拟机,而我要用vagrant管理已存在的虚拟机,就是 vagrant up的时候,我需要启动…

MySQL数据库:常用数据类型

一、整形和浮点型 数据类型大小说明对应C类型bit(n)n指定比特位数,默认1位比特位数,n范围1-64;存储数值范围2-2^n-1char[]tinyint1字节signed charsmallint2字节short intint4字节intbigint8字节long long intfloat(m,d)4字节单精度&#xf…

【前端】CSS基础

一、CSS基础 1.1CSS的介绍 CSS:层叠样式表(Cascading style sheets) CSS作用是什么?? 1.2CSS语法规则 写在哪里? CSS是style标签中,style标签一般写在head标签里面,title标签下…

真的强,又一个开源项目,杀疯了

最近,AI大模型连续火爆出圈,人工智能生成模型(AIGC)的热度尚未褪去,聊天机器人ChatGPT便引发全网热议,两周吸引百万用户。还有卷趴一半程序员的AlphaCode,生成全新蛋白质的ESM2等,不…

TypeScript,终于在实际项目中用到了泛型。

终于在实际项目中用到了泛型 里程碑式的纪录,终于不是anyScript了,代码写完只有一个any 应用 项目中组件化了这么一个东西 功能描述: 传进去一个数组,有个名,有个key,渲染成上图的div样式点击之后&#…

Triple 协议支持 Java 异常回传的设计与实现

作者:陈景明 背景 在一些业务场景,往往需要自定义异常来满足特定的业务,主流用法是在catch里抛出异常,例如: public void deal() {try{//doSomething ...} catch(IGreeterException e) {...throw e;} }或者通过…

Python面向对象(九)

python学习之旅(九) 👍查看更多可以关注查看首页或点击下方专栏目录 一.什么是面向对象 万物皆对象 现实世界的事物都有属性和行为,可在程序中抽离为类来描述现实世界的事物属性和行为。 使用类充当程序内现实事物的“设计图纸”,基于图纸(类)生产实体…

10. 正则表达式匹配

题目链接:https://leetcode.cn/problems/regular-expression-matching/从暴力递归到动态规划,对于状态转移方程不容易推导出来的可以先从递归进行尝试各种策略,最后再从暴力递归转为动态规划,这种尝试方式容易求解dp初始值以及dp更…

数据结构-考研难点代码突破 (图关键路径完全解析(流程+代码) - C++代码)

考研在关键路径上的考察以流程为主 文章目录1. AOE网2. 关键路径问题解决流程C代码1. AOE网 首先区分AOV网&#xff1a; AOV网∶若用DAG 图&#xff08;有向无环图&#xff09;表示一个工程&#xff0c;其顶点表示活动&#xff0c;用有向边<Vi&#xff0c;Vj>表示活动 V…