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示例 ...
随机推荐
- CANoe工具的安装
CANoe是德国Vector公司为汽车总线的开发而设计的一款总线开发环境,全称叫CAN open environment,用于分析和模拟CAN(Controller Area Network)和LIN ...
- 【C#/.NET】Dapper使用QueryMultipleAsync执行多条SQL
目录 背景 解决方案 总结 背景 对于查询数据列表的功能,需要分页已经查询总数.这里涉及两句SQL,一个是查询分页对应的数据,第二个是Count(*); 会导致部分重复代码和两次的数据库查询. ...
- 揭秘 Task.Wait
目录 简介 背后的实现 Task.Wait 的两个阶段 SpinWait 阶段 BlockingWait 阶段 Task.Wait 可能会导致的问题 可能会导致线程池饥饿 可能会导致死锁 .NET 6 ...
- 基于瑞芯微camera文章汇总pdf分享给大家
前面一段时间基于瑞芯微3568平台编写了camera系列文章, 一共12篇,目前更新完毕. <瑞芯微文章合集> camera系列文章编写前后一共花费2个月时间, 期间查阅了很多资料,做了很 ...
- 11k+ Star 一款更适合中国用户的开源 BI 工具
在当今数字化时代,数据分析和可视化成为企业决策和发展的重要支撑,很多 BI 工具昂贵的许可费用,让许多中小型企业用户和个人用户望而却步,开源 BI 工具的出现,让其成为很多用户进行数据分析展示的首选. ...
- 吴恩达优化算法 (Optimization algorithms)笔记
Mini-batch 梯度下降(Mini-batch gradient descent) 使用batch梯度下降法,一次遍历训练集只能让你做一个梯度下降,使用mini-batch梯度下降法,一次遍历训 ...
- Web网页音视频通话之Webrtc相关操作(一)
目录 打开摄像头/关闭摄像头 静音/解除静音 打开视频/关闭视频 截图且下载 打开摄像头/关闭摄像头 效果图 HTML <!DOCTYPE html> <html lang=&quo ...
- Web网页音视频通话之Webrtc相关操作(二)
效果图 HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 从0开发WebGPU渲染引擎:实现路径追踪
大家好,本文基于WebGPU的计算着色器实现了基础的路径追踪器,支持Middle BVH和No BVH两种加速结构 我主要是将离线渲染零基础实战开发培训班(一期)->第二十九节课的代码移植到We ...
- 【MAUI Blazor踩坑日记】3.Windows标题栏自定义颜色,运行时改变颜色
目录 修改默认颜色 修改运行时颜色 效果图 MAUI中Windows默认的标题栏颜色是灰色的,有一点丑. 如果去掉默认的标题栏,自己画一个,可能会出现问题,也比较麻烦. 想要自定义默认标题栏的颜色,官 ...