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示例 ...
随机推荐
- iOS中容易用错的常用知识点
坐标系转换 ios中的坐标系有三种 视图坐标系:原点(0,0)视图的左上角 窗口坐标系:原点(0,0)窗口的左上角 世界坐标系:原点(0,0)游戏中世界的原点 平时开发中经常会遇到转UIWindow坐 ...
- Kubernetes(k8s)健康性检查:livenessprobe探测和readinessprobe探测
目录 一.系统环境 二.前言 三.Kubernetes健康性检查简介 四.创建没有探测机制的pod 五.添加livenessprobe探测 5.1 使用command的方式进行livenessprob ...
- Java(if选择、switch选择、循环)
1.if 选择结构 //语法 if(表达式){ //语句:(表达式为真) }else{ //语句:(表达式为假) } --------------------------------------- 例 ...
- 9.3. Hibernate框架
Hibernate是一个开源的持久层框架,它可以帮助我们将Java对象映射到数据库表中,并实现对象的持久化操作.Hibernate提供了丰富的API,可以方便地进行CRUD(增删改查)操作,而无需手动 ...
- mybatis-plus是什么框架,使用起来简单吗?文末有彩蛋
mybatis框架我们都熟悉了,是用来操作数据库的属于ORM框架.mybatis-plus是什么框架,看名称和手机似的,带有plus一定是加强版,其官网是:MyBatis-Plus (baomidou ...
- 【LeetCode.384打乱数组】Knuth洗牌算法详解
前两天看网易面筋得知网易云的随机歌曲播放使用了这个算法,遂找题来做做学习一下 打乱数组 https://leetcode.cn/problems/shuffle-an-array/ 给你一个整数数组 ...
- 前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮
前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin? ...
- clickhouse使用入门
转载请注明出处(- ̄▽ ̄)-严禁用于商业目的的转载- 导语:同学,你也不想你根本不懂ClickHouse,却赶鸭子上架使用的事情被其他人知道吧? 写在前面:本文旨在让原先有一定SQL基础的人快速简单了 ...
- Blazor前后端框架Known-V1.2.3
V1.2.3 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...
- python笔记:第六章函数&方法
1.系统函数 由系统提供,直接拿来用或是导入模块后使用 a = 1.12386 result = round(a,2) print(result) > 1.12 2.自定义函数 函数是结构化编程 ...