当前位置: 首页 > backend >正文

Mysql如何高效的查询数据是否存在

文章目录

  • 1. 三种方法
  • 2. 查询语句执行流程
  • 3. 三种方式对比

1. 三种方法

在业务中,我们有时候需要查询某个数据在数据表中是否存在,常见的方式有三种

  1. SELECT COUNT(*) FORM tb_name WHERE condition
  2. SELECT 1 FROM tb_name WHERE condition
  3. SELECT EXISTS (SELECT 1 FROM tb_name WHERE condition)

2. 查询语句执行流程

在这里插入图片描述

其中:查询语句的执行流程是:

分析器 -> 权限校验 -> 执行器 -> 引擎 -> redo log(prepare状态) -> binlog -> redo log(commit状态)

3. 三种方式对比

在我们没有设置索引的前提下,执行SELECT COUNT 的时候,会在存储引擎层进行全表扫描,将所有符合查询条件的数据全部都找到,返回到Server层,再到Server层进行数据统计,将结果返回给用户

但是实际上,我们的目的是查询表里面是否有我们需要的数据即可,没有必要将所有的数据都查到
在这里插入图片描述

因此我们可以使用limit来进行改善

同样这种方式,在没有设置索引的情况下,也会进行全表扫描,但是通过这种方式,一旦通过条件,找到一条需要的数据,就不会再找了,将这条数据直接返回到Server层

在这里插入图片描述

这种方式的性能肯定比直接COUNT要好,因为他只会检索到一条数据

但是实际上,我们只需要知道表里面是否存在数据,我们并不需要整行的数据,因此可以使用EXISTS来进行再次优化

通过这种方式,通过LIMIT 1在引擎层进行检索,只要发现了数据,直接返回TRUE,再到SERVER层进行处理,最终返回1 / 0,表示存在 / 不存在

在这里插入图片描述

经过对比,很明显COUNT的性能是最低的,LIMIT 1EXISTS假设在数据量很小的情况下,当然差别不大,但是假设数据行里面是大文本内容,就会影响一定的性能

因此EXISTS通常是最好的方式

http://www.xdnf.cn/news/2518.html

相关文章:

  • 理解 Kubernetes 初始访问向量(一)——控制平面
  • 【Webpack \ Vite】多环境配置
  • makefile总结
  • 关于Spark知识点与代码测试的学习总结
  • 单片机 + 图像处理芯片 + TFT彩屏 复选框控件
  • 30-算法打卡-字符串-重复的子字符串-leetcode(459)-第三十天
  • 使用 Cherry Studio 调用高德 MCP 服务
  • NFS从零部署
  • 华为 CCE 查看节点剩余可调度cpu核数
  • 从零实现分布式WebSocket组件:设计模式深度实践指南
  • 路由协议基础
  • babel和loader的关系
  • 微深节能 平板小车运动监测与控制系统 格雷母线
  • LeetCode题解1297. 子串的最大出现次数
  • 低压电工常见知识点
  • 麒麟系统通过 Service 启动 JAR 包的完整指南
  • 【KWDB 创作者计划】_KWDB引领数据库技术革新的璀璨之星
  • 业务校验工具包-validate-utils介绍
  • spring-rabbit的CachingConnectionFactory默认参数导致消费者Channel数量暴增问题解决
  • go语言八股文(三)
  • Deep Dark Sea 局域網文件共享即時匿名聊天去數據庫部署
  • Ldap高效数据同步- MirrorMode双主复制模式配置详解(下)
  • spring项目rabbitmq es项目启动命令
  • 【Pandas】pandas DataFrame rfloordiv
  • 查回来的数据除了 id,其他字段都是 null
  • 【音视频】SDL事件
  • AI 发展历史与关键里程碑_附AI 模型清单及典型应用场景以及物流自动化适合的模型选择
  • 从零开始开发一个简易的五子棋游戏:使用 HTML、CSS 和 JavaScript 实现双人对战
  • windows安装docker,发现没有hyper
  • JVM常见的垃圾回收器