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

解决sql查询中in查询项过多时很慢的问题

最近遇到查询一张大数据量表时,需要对一个字段做in查询,in中的元素数量可能达到几千个,即使对这个字段加上索引,速度也慢到无法接受

示例表结构如下:

 表中有几十万的数据,且example_id和data_id字段加了联合索引,只做一个简单的select查询:

select * from TEST_TABLE01 where example_id=:exampleId and data_id in(:dataIds)

 其中in存在1000个元素,查询速度很慢,因为in的个数太多,会全表扫描,导致索引失效。

优化方案:

不使用in语法,将sql语句简化成下面这种,索引就生效了

select * from TEST_TABLE01 where example_id=:exampleId and data_id=:dataId

但是这样一次只能查询一条data_id匹配的数据,这就意味着程序要和数据库交互1000次,但是我测试的速度要快于上面的in方式。

进一步优化,减少数据库交互方式,使用union all拼接sql: 

select * from TEST_TABLE01 where example_id=:exampleId and data_id=:dataId0
union all
select * from TEST_TABLE01 where example_id=:exampleId and data_id=:dataId1
union all
select * from TEST_TABLE01 where example_id=:exampleId and data_id=:dataId2
union all
select * from TEST_TABLE01 where example_id=:exampleId and data_id=:dataId3
...
...
union all
select * from TEST_TABLE01 where example_id=:exampleId and data_id=:dataId999

 程序中对dataId的参数进行组装,这样只和数据库交互一次,索引也不会失效,这种方式解决了in查询慢的问题。

对于delete也可以使用类似的方式优化:

delete from TEST_TABLE01 a
WHERE exists (select * from (select * TEST_TABLE01 where example_id=:exampleId and data_id=:dataId0union allselect * TEST_TABLE01 where example_id=:exampleId and data_id=:dataId1) b where a.id=b.id
)

http://www.lryc.cn/news/571972.html

相关文章:

  • django 获取 filter后的某一个属性的list
  • 【Java学习笔记】Java绘图基础
  • 【学习笔记】2.2 Encoder-Decoder
  • Neo4j 入门到精通(Cypher语言详解)
  • 湖北理元理律师事务所小微企业债务重组方案:司法与经营的共生逻辑
  • b站视频如何下载到电脑上
  • jupter 如何修改文件位置
  • 【AI Study】第四天,Pandas(8)- 最佳实践
  • 湖北理元理律师事务所债务优化模型:法律与生活的平衡之道
  • 《汇编语言:基于X86处理器》第2章 x86处理器架构
  • 《仿盒马》app开发技术分享--未完成订单列表展示逻辑优化(61)
  • 机器学习常用评估指标
  • springboot使用nacos注册中心、配置中心的例子
  • C/Fortran多核并行计算
  • (LeetCode 面试经典 150 题 ) 26. 删除有序数组中的重复项 (双指针)
  • A 股无风不起浪!金融吸血科技
  • 黑马python(八)
  • 利用 Nginx 实现灰度环境的 H5 应用发布策略
  • 将iOS上架流程融入DevOps体系:从CI构建到App Store发布的完整实践
  • 嵌入式之硬件学习(三)通信方式、串口通信
  • PostgreSQL的扩展autoinc
  • Mac 安装 VMware Fusion
  • YOLOv11改进系列---Conv篇---2024最新深度可分卷积与多尺度卷积结合的模块MSCB助力yolov11有效涨点
  • macos电脑本地搭建mistral-7b大模型出现4-bit量化和缓存不足问题的记录
  • 蓝牙版本演进史:从 1.0 到 5.4 的技术突破 —— 面试高频考点与历年真题详解
  • C#List的join查询
  • Uniapp 中 onShow 与 onLoad 的执行时机解析
  • 【JAVA】的SPI机制
  • new()和new[]有什么区别?
  • tomcat 配置规范