当前位置: 首页 > 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的个数太多,导致索引失效,会全表扫描。

下面有两种优化方案:

优化方案1

不使用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查询慢的问题。

优化方案2(推荐

参考很多大厂系统查询的做法,查询条件中常常携带上一个创建时间的默认参数,后台通过创建时间大于或小于传入值来筛选掉大部分不需要的数据,这个创建时间在后台表中建有索引,这样查询速度非常快。

这里我们也可以参考这种思路,将in中的元素list进行升序排序,取第一个(firstV)和最后一个(lastV),优化写法:

select * from TEST_TABLE01 where example_id=:exampleId and data_id>=:firstV and data_id<=:lastV and data_id in(:dataIds)

使用最大值和最小值来限定data_id字段,这个时候索引也是生效的,data_id in(:dataIds)这个查询条件可以根据实际场景看是否可以去掉(比如data_id是主键,并且dataIds是连续且有序的集合)。

注意:如果firstV和lastV不是取自有序的结果集,可能会导致查询结果数据量仍然很多,无法达到预期速度。

因此来源结果集dataIds最好能有序,可以使用order by多个索引字段,使dataIds数据有序,这样能达到最大效果。

联合索引时查询也同理,每个索引字段都取得最大值和最小值,再构造sql:

select * from TEST_TABLE01 where example_id=:exampleId and col1>=:col1Min and col1<=:col1Max and col2>=:col2Min and col2<=:col2Max and (col1,col2) in((:col1_n,:col2_n),...)

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

delete from TEST_TABLE01 WHERE example_id=#{exampleId} and data_id>=#{startDataId} and data_id<=#{endDataId}
http://www.jsqmd.com/news/1167310/

相关文章:

  • 2026 年 7 月山西工矿轴承采购合作企业:山西艾弗艾基进口设备贸易有限公司 - 信息热点
  • 积家官方服务项目及价格查询|热线电话与门店地址权威信息公告(2026年7月最新) - 积家官方售后服务中心
  • 2026汕头靠谱防水服务商:卫生间免砸砖、外墙、地下室、楼顶渗漏维修 本地正规报价(7月最新) - 吉林同城获客
  • 输送线厂家实地考察别白跑!过来人总结 8 个考察重点,避开 90% 采购大坑
  • 如何用Unlock Music终极解决音乐格式限制:3种快速免费的解密方法
  • 【Gemini Gmail集成实战指南】:20年谷歌生态专家亲授5大避坑要点与3步自动化部署法
  • 2026 旧房改造哪家真靠谱广州二手房翻新全攻略深度详解 - 优企甄选
  • 终极指南:如何让2007-2017年老旧Mac免费升级最新macOS系统
  • 2026年7月泰州姜堰区装备制造与文旅品牌优选5家SEO/GEO服务商综合测评|AI搜索品牌曝光与企业科学选型指南 - 招财兔数字员工
  • 卡地亚中国官方售后服务中心|地址与联系电话权威信息声明(2026年7月更新) - 卡地亚服务中心
  • 代码生成只是起点,企业 AI 落地的四大无解核心挑战
  • 3步自动化黑苹果安装:OpCore Simplify终极配置指南
  • 2026柳州靠谱防水服务商:卫生间免砸砖、外墙、地下室、楼顶渗漏维修 本地正规报价(7月最新) - 吉林同城获客
  • yuzu模拟器完整指南:在电脑上免费畅玩Switch游戏的终极方案
  • 【学习复盘】聊聊近期C语言进阶ICT VLAN互通学习心得(附代码)
  • Flint:专为AI设计的可视化中间语言,解决智能体图表生成难题
  • 2026潮州靠谱防水服务商:卫生间免砸砖、外墙、地下室、楼顶渗漏维修 本地正规报价(7月最新) - 吉林同城获客
  • 为什么极端条件下的中子星上电子依然安然无恙?
  • cann/cannbot-skills HIVM三元向量运算
  • 卡地亚中国官方售后服务中心|服务热线及具体地址权威信息公示(2026年7月最新) - 卡地亚官方售后中心
  • 2026安徽中考100-200分落榜?别乱择校,合肥省属公办建工院校正在招生 - 小张zc
  • (4-4-02)Bellman-Ford路径规划
  • 2026西安幼儿园除甲醛实用指南 服务明细与机构选择建议 - 西安治泉环保
  • g2o图优化库从源码编译安装:Ubuntu环境下的完整指南与问题排查
  • 盐城黄金换新服务实测:四家主流门店核心维度对比 - 招财兔数字员工
  • PlantCV性能优化:如何提升植物图像处理速度与精度
  • Mysql二进制日志binglog文件如何删除是否磁盘空间
  • 收藏!前端小白也能轻松上手AI大模型,私有云部署实操全解析
  • 传统交互与数字人智能语音交互的异同解析,解锁智能交互新优势✨
  • 《2026海归求职服务行业白皮书:避坑指南与标杆案例解析》 - 招财兔数字员工