SQL判断是否"存在",还在用 count 操作?

qiaohhgz 2020-12-25 10:51:03 ⋅ 704 阅读

来源:http://toutiao.com/i6826511837840802315

根据某一条件从数据库表中查询 『有』与『没有』,只有两种状态,那为什么在写SQL的时候,还要SELECT count(*) 呢?

无论是刚入道的程序员新星,还是精湛沙场多年的程序员老白,都是一如既往的count

目前多数人的写法

多次REVIEW代码时,发现如现现象:

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

#### SQL写法:
SELECT count(*) FROM table WHERE a = 1 AND b = 2

#### Java写法:
int nums = xxDao.countXxxxByXxx(params);
if ( nums > 0 ) {
  //当存在时,执行这里的代码
} else {
  //当不存在时,执行这里的代码
}

是不是感觉很OK,没有什么问题

优化方案

推荐写法如下:

#### SQL写法:
SELECT 1 FROM table WHERE a = 1 AND b = 2 LIMIT 1

#### Java写法:
Integer exist = xxDao.existXxxxByXxx(params);
if ( exist != NULL ) {
  //当存在时,执行这里的代码
} else {
  //当不存在时,执行这里的代码
}

SQL不再使用count,而是改用LIMIT 1,让数据库查询时遇到一条就返回,不要再继续查找还有多少条了

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

总结

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


全部评论: 0

    我有话说:

    挖一挖那些让公司网站瘫痪的SQL“终结者”

    一条慢查询会造成什么后果?之前我一直觉得不就是返回数据会慢一些么,用户体验变差? 其实远远不止,我经历过几次线上事故,有一次就是由一条 SQL 慢查询导致的。 那次是一条 SQL 查询耗时达到 2

    面试官:如何海量数据中判断某个数据是否存在

    https://www.toutiao.com/a6756788128960217604这是一道面试题:如何

    为朋友圈积赞苦恼么

      为朋友圈积赞苦恼么 分分钟搞定 github地址--- https://github.com/TransparentLC/WechatMomentScreenshot 网站地址

    注解实现接口的操作流水日志

    作者:Lvshen的技术小屋  原文:https://www.toutiao.com/i689551231529549876 项目中,我们会需要获取接口的操作日志。比如获取接口的接口名

    8 种最坑的 SQL 错误法,你有没有踩过坑?

    编写复杂SQL语句要养成使用 WITH 语句的习惯。简洁且思路清晰的SQL语句也能减小数据库的负担 。

    强大的 Lambda 式转 Sql 类库 - SqlSugar 隐藏功能之 Lambda

    使用场景 1、Lambda to sql 一直是ORM中最难的功能之一,如果有现成的解析库那么自已写一个ORM难度将大大降低 2、通过Lambda作为KEY进行缓存操作,特别是仓储模式想要拿到表达式

    mongoHelper 0.3.9 发布,spring-data-mongodb 增强工具包,简化 CRUD 操作

    mongoHelper 是基于 spring-data-mongodb 的增强工具包,简化 CRUD 操作,提供类 jpa 的数据库操作。 传统关系型数据库及围绕它们构建的 orm 项目开发中有很

    刚刚入职新公司,为什么老大不让Lombok?

    刚刚入职一家新的公司,写业务的时候引入了Lombok 结果老大代码审查的时候微信群里截图说不让项目里面Lombok,说是会带来各种问题,大家都吗?

    【实战解析】基于HBase的大数据存储京东的应用场景

    作者就职于京东商城京麦平台组,从事京东商家开放平台的相关开发工作。热爱技术,熟悉各种常开源框架,有丰富的大型分布式系统、高并发系统的开发经验。热衷于对大数据的研究,对Hadoop、HBase以及

    Redis系列九 推荐系统-布隆过滤器

      布隆过滤器 概念 布隆过滤器是一种空间利用率较高的概率型数据结构,来测试一个元素是否集合中。但是存在一定可能,导致结果误判。当布隆过滤器说某个值存在时,这个值可能不存在;当它说不

    项目中为什么Docker?

      项目为什么要 docker,需要了解 docker 的优势,结合项目的实际情况来决定是否需要使用 docker,千万不能“为了使用而使用”或者“跟风使用 docker”。 使用

    SQL 模板神器

    SqlTemplate - MyBatis SqlTemplate - MyBatis 是sql模板引擎,主要解决动态拼接sql字符串 。原理是比较简单,把模板内容构建成完成的xml,这样

    CrateDB 4.3.1 发布,分布式 SQL 数据库

    CrateDB 4.3.1 预发布。Crate 是一个开源的大规模的可伸缩的数据存储系统,无需任何系统管理需求。提供强大的搜索功能。用于存储各种表格数据、非结构化数据和二进制对象。并可通过 SQL

    服务化改造实践 | 如何 Dubbo 中支持 REST

    随着微服务的流行以及多语言互操作诉求的日益增多, Dubbo 中暴露 REST 服务变成了一个不容忽视的诉求。

    MongoDB 数据库的基本操作(二)

    MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

    代码这样优化,瞬间清爽多了

    今天这篇文章我们又来聊聊代码优化。 隐藏行为细节 平时的开发过程中,你肯定会碰到这样的业务,比如判断车速是否正常。一般编码如下: float speed = 60f

    jQuery 3.6.0 发布,即使存在 JSONP 错误也返回 JSON

    jQuery 是一个快速、小型且功能丰富的 JavaScript 库。通过易于使用的 API(可多种浏览器中使用),使 HTML 文档的遍历和操作、事件处理、动画和 Ajax 等操作变得更加简单

    Redis面试整理:Redis几种数据类型的法和应用场景重新梳理了一下

    1、字符串 1.1 介绍 string 字符串类型是Redis中最为常和基础的存储类型,是一个由字节组成的序列,他Redis中是二进制安全的,也可以认为string字符串数据类型能够接收任何格式