SQL查询中的小技巧:SELECT 1 和 LIMIT 1 替代 count(*)
前言
在写SQL查询时,常规做法是使用
SELECT count(*)来统计符合条件的记录数。
然而,在某些情况下,我们只关心是否存在符合条件的记录,而不需要知道具体的记录数。
为了优化性能,可以改用使用
SELECT 1和LIMIT 1的方式查询。
在业务代码中,直接判断查询结果是否非空即可,不再需要使用
count来获取记录数。
实战
我们使用Java和MyBatis演示优化方案的代码示例。
假设我们有一个名为
User的数据库表,其中包含id、name和age字段。我们想要检查是否存在年龄大于等于18岁的用户。
- 创建一个
UserMapper接口,定义一个方法来执行查询操作:
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
Integer existUsersWithAgeGreaterThan(int age);
}
- 在
UserMapper.xml中实现这个方法,使用优化的SQL语句:
<?xml version="1.0" encoding="UTF-8"?>
<mapper namespace="com.example.mapper.UserMapper">
<select id="existUsersWithAgeGreaterThan" resultType="java.lang.Integer">
SELECT 1 FROM users WHERE age >= #{age} LIMIT 1
</select>
</mapper>
- 然后,在业务代码中调用
existUsersWithAgeGreaterThan方法进行判断:
import com.example.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserMapper userMapper;
@Autowired
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public void checkUsersWithAgeGreaterThan(int age) {
Integer exist = userMapper.existUsersWithAgeGreaterThan(age);
if (exist != null) {
// 当存在满足条件的用户时,执行这里的代码
System.out.println("存在符合条件的用户");
} else {
// 当不存在满足条件的用户时,执行这里的代码
System.out.println("不存在符合条件的用户");
}
}
}
通过调用
existUsersWithAgeGreaterThan方法获取查询结果,并根据结果是否为空来判断是否存在满足条件的用户。
优化
既然讲到这里,也就顺便提一下数据库查询的一般性能调优做法,在数据量十分庞大的情况下,这里给出几点建议:
索引优化:确保在查询条件列上存在适当的索引,以加快查询速度。比如当前的示例,可以在
age列上创建索引;分页查询:如果只关心是否存在满足条件的记录,但不需要具体的记录内容,可以考虑使用分页查询的方式进行优化。通过限制返回结果的数量,可以减少查询的开销;
缓存机制:如果查询结果相对稳定或者经常被重复查询,可以考虑使用缓存来避免重复的数据库查询操作,从而提高响应速度,比如把前几页缓存下来,因为很多用户可能不会一直往后点;
数据库调优:对数据库进行性能调优,包括优化查询计划、调整内存设置、合理配置数据库连接池等,可以提升整体查询性能。
总结
其实案例中的优化方案在查询结果集较大时已经非常有效,可以说是肉眼可见的性能提升,在某些情况下还可以减少联合索引的创建。
总而言之,通过使用
SELECT 1和LIMIT 1代替SELECT count(*),可以提高查询性能并简化业务代码,特别适用于仅需判断是否存在符合条件的记录的场景。
好了,今天这个小知识,你学会了吗?
如果喜欢请点赞关注↓↓↓,持续分享干货哦!
SQL查询中的小技巧:SELECT 1 和 LIMIT 1 替代 count(*)的更多相关文章
- SQL Server中的小技巧(重复、替换、截取、去空格、去小数点后的位数)
PS:随笔写的在SQL Server中要用到的 (重复.替换.截取.去空格.去小数点后的位数) /*---------------------------重复--------------------- ...
- spring MVC +freemarker + easyui 实现sql查询和执行小工具总结
项目中,有时候线下不能方便的连接项目中的数据源时刻,大部分的问题定位和处理都会存在难度,有时候,一个小工具就能实时的查询和执行当前对应的数据源的库.下面,就本人在项目中实际开发使用的小工具,实时的介绍 ...
- SQL 查询语句总是先执行 SELECT?你们都错了
很多 SQL 查询都是以 SELECT 开始的.不过,最近我跟别人解释什么是窗口函数,我在网上搜索"是否可以对窗口函数返回的结果进行过滤"这个问题,得出的结论是"窗口函数 ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- lua学习笔记11:lua中的小技巧
lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一. 巧用or x = x or v 等价于: if not x then x = v end 假设x为nil或false,就给他赋 ...
- 杂谈---小故事小道理,面试中的小技巧(NO.2)
本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...
- Sql中的小技巧
1.where 字段名 regexp '正则表达式' 正则符号: ^ $ . [ ] * | . 表示1个任意字符 * 表示前面重复0次,或者任意次 ^ 开始 $ 结尾 [] 范围 | 或 sql示例 ...
- SQL查询中in、exists、not in、not exists的用法与区别
1.in和exists in是把外表和内表作hash(字典集合)连接,而exists是对外表作循环,每次循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的,如果查询的两个表大小 ...
- 在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。
转载https://www.cnblogs.com/zhang-bo/p/9138151.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建 ...
- Mysql中的小技巧
1.where 字段名 regexp '正则表达式' 正则符号: ^ $ . [ ] * | . 表示1个任意字符 * 表示前面重复0次,或者任意次 ^ 开始 $ 结尾 [] 范围 | 或 sql示例 ...
随机推荐
- html+css实现二级导航栏效果,简单易看懂噢!
这应该是这几天以来看到的最简单易懂的有二级菜单栏的导航栏效果实现了 使用html+css实现,看了好几天导航栏的实现方式,要么是太复杂的需要JS或者框架的,要么是太简单仅仅使用div和超链接的, 再要 ...
- 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 Paddle Infer ...
- .NET7 中Autofac依赖注入整合多层,项目中可直接用
一.配置Autofac替换内置DI 1.安装Nuget包:Autofac.Extensions.DependencyInjection 2.Program.cs中加上 builder.Host.Use ...
- 简单了解一下国产GPU
英伟达都一万亿市值了,国产GPU现在发展的怎么样了?万字长文,有兴趣的进来简单了解一下. 最近,与GPU有关的几个科技新闻:一是英伟达NVIDIA市值超过一万亿美元,成为全球第一家市值过万亿的芯片公司 ...
- 【Azure 媒体服务】Azure Media Player 在Edge浏览器中不能播放视频问题的分析与解决
问题描述 使用Azure Media Service 制作视频点播服务,在客户端使用 Azure Media Player 播放器在 Edge 浏览器中播放视频时候遇见无法播放的问题: 错误信息: T ...
- 性能_3 jmeter连接数据库jdbc(sql server举例)
一.下载第三方工具包驱动数据库 1. 因为JMeter本身没有提供链接数据库的功能,所以我们需要借助第三方的工具包来实现. (有这个jar包之后,jmeter可以发起jdbc请求,没有这个jar包, ...
- Self-Instruct 论文解读:利用大模型自己给自己生成指令数据,指令数据自动生成
总览 大规模"指令调整"的语言模型,即指令微调的LLM,已经表现出非凡的零样本能力,尤其是推广新任务上. 然而,这些模型严重依赖于人类编写的指令数据,而这些数据通常在数量.多样性和 ...
- O2OA(翱途)开发平台如何在流程表单中使用基于Vue的ElementUI组件?
本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计,O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操作. 在流程表单设计界面, ...
- Java stream流使用
1.使用filter()过滤List //查找身高在1.8米及以上的学生 List<StudentInfo> boys = studentList.stream().filter(s-&g ...
- Angular报错:Error: Unknown argument: spec
解决方案 使用--skip-tests代替 效果展示 可以看到spec.ts消失了 参考链接 https://stackoverflow.com/questions/62228834/angular- ...