最近遇到查询一张大数据量表时,需要对一个字段做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.pswp.cn/pingmian/85521.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85521.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85521.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring---Spring MVC 执行流程

SpringMVC执行流程分为两个:前后端分离与视图阶段(不分离) 视图阶段(JSP/Thymeleaf/Freemarker) SpringMVC 前后端分离阶段 SpringMVC中重要组建有哪些? 前端控制器(DispatcherServlet&#x…

Llama 4模型卡片及提示词模板

Llama 4模型卡片及提示词模板 Llama 4 模型卡及提示格式介绍 Llama 4 模型概述 Llama 4 是一系列预训练和指令微调的混合专家(Mixture-of-Experts, MoE)大语言模型,包含两种规模:Llama 4 Scout和Llama 4 Maverick。该模型针对多模态理解、多语言任务、编码、工具调用及智…

使用Advanced Installer软件将winform程序打包成exe安装文件

使用Advanced Installer软件将winform程序打包成exe安装文件_c#程序打包软件-CSDN博客 软件的下载连接 https://download.csdn.net/download/qq_20222919/87780646

NDS 中文游戏全集下载 任天堂NDS简介NDS支持GBA游戏

这是一份关于任天堂NDS游戏及其平台的简介: 游戏全集打包下载 https://pan.quark.cn/s/8805da9a09c4 NDS 是什么? 全称: Nintendo DS (NDS)类型: 由任天堂开发和发行的掌上游戏机。世代: 第七世代游戏机 (与PSP、Wii…

Kamailio rtpengine_subscribe_request

master 版本的 rtpengine 新增了函数 rtpengine_subscribe_request 应该是 siprec 增加的 改天做下测试 参考链接: https://lists.kamailio.org/mailman3/hyperkitty/list/sr-userslists.kamailio.org/thread/Q7YJDVBHZX4BIWG23VRVRYW7N5SAAUOR/ https://kamai…

Java八股文——计算机网络「网络模型篇」

什么是OSI七层模型? 面试官您好,OSI(Open Systems Interconnection)七层模型,是由国际标准化组织(ISO)提出的一个网络互联的开放式参考模型。 它是一个理论上的、概念性的框架,其核…

国产服务器【银河麒麟v10】【CPU鲲鹏920】部署Nacos

目录 准备工作开始安装1. 下载nacos2. 启动3. 检查 结束 准备工作 环境要求:Linux虚拟机nacos2.3.2 安装包 开始安装 1. 下载nacos 方式1 wget https://github.com/alibaba/nacos/releases/download/2.3.2/nacos-server-2.3.2.tar.gz方式2 去官网自行下载所需版…

一款强大的音视频处理工具--FFmpeg-2--常用音频处理示例

1、查看音频文件详细信息 opus,wav,pcm等音频格式都适用。 ffprobe -i 1.opus说明: Input 0, ogg, from ‘1.opus’: Input 0:表示这是第一个输入文件。ogg:表示该文件封装在Ogg容器格式中(Opus通常封装…

在 ArcPy 脚本中进行错误处理和调试

查看错误信息 当捕获到错误后,查看详细的错误信息对于定位问题和解决问题至关重要。 (一)打印错误消息 在 except 块中,可以直接打印错误对象来获取错误消息。例如: try:arcpy.CalculateField_management("in…

C++11标准(4)——并发库(多线程)

欢迎来到博主的专栏:c杂谈 博主ID:代码小豪 文章目录 thread的相关函数thisthread c11新增了与并发相关的库,包含线程、以及互斥、同步等与线程安全相关的库,与linux中所使用POSIX库不同,并发库是将其进行了封装,不再是…

优化TCP/IP协议栈与网络层

优化TCP/IP协议栈与网络层 在高性能架构中,网络性能往往成为系统吞吐量与响应速度的关键因素之一。而TCP/IP协议栈作为现代互联网通信的核心,其默认配置在高并发场景下常常无法满足大规模分布式系统的性能需求。因此,架构师在构建系统时,有必要对TCP/IP协议栈及其所在的网…

Nginx常见功能

Nginx 是一个高性能的 HTTP 和反向代理服务器,除了基本的 Web 服务功能外,它还支持许多高级功能。以下是 Nginx 常用的一些功能及其设置方法: 1. 反向代理 反向代理是 Nginx 最常用的功能之一,用于将客户端请求转发给后端服务器&a…

UniSAL:用于组织病理学图像分类的统一半监督主动学习方法|文献速递-深度学习医疗AI最新文献

Title 题目 UniSAL: Unified Semi-supervised Active Learning for histopathologicalimage classification UniSAL:用于组织病理学图像分类的统一半监督主动学习方法 01 文献速递介绍 组织病理学图像在癌症筛查、诊断及治疗决策中起着关键作用,有助…

智慧园区建设资料合集(Wordppt原件)

化工园区安全风险智能化管控平台.docx 数字孪生赋能的智慧园区物联网云平台建设方案.pptx 园区智慧安防解决方案.docx 新型智慧园区规划设计方案.pptx 新型智慧园区建设方案.docx 园区大数据治理解决方案.pptx 智慧产业园区综合解决方案.docx 智慧工业园区大数据云平台解决方案…

好玩的镜像汇总

一些镜像仓库汇总 https://github.com/code-lives/Nas-Docker https://github.com/TWO-ICE/Awesome-NAS-Docker image-matting是一款集成了AI大模型的,支持容器化部署的短平快抠图工具 https://mp.weixin.qq.com/s/A1VKAYaDdbCs2o1L4ZYkSw Moodist是一个有助于专注…

langchain 开发实战

我的开发环境是 windows python3.8 langchain版本: # langchain 0.2.17 # langchain-community 0.2.19 # langchain-core 0.2.43 # langchain-openai 0.1.25 # langchain-text-…

粉色 PCB:当电路板染上温柔的科技浪漫

在电子产品的世界里,印制电路板(PCB)是其核心的 “骨架”,支撑并连接着各种电子元件,让电子产品得以实现复杂的功能。以往,PCB 常见的颜色是绿色,然而,猎板打破常规,推出…

Navicat 技术指引 | TiDB 数据查看器

目前,Navicat 两款工具支持对 TiDB 数据库的管理开发功能:一款是旗舰款 Navicat Premium,另一款是其轻量化功能的 Navicat Premium Lite(官方轻量级免费版)。Navicat 自版本 17.1 开始支持 TiDB 7。它支持的系统有 Win…

xlsx、xlsx-style 的配置及导出(分享)

文章目录 1. 基础配置1.1 单元格内容1.2 单元格合并、列宽、行高1.3 单元格样式 2. sheet 配置、多个 sheet3. excel 导出4. 数据插入(进阶) 1. 基础配置 1.1 单元格内容 注:xlsx、xlsx-style 都存在 write 方法,xlsx 设置单元格…

算法第38天|322.零钱兑换\139. 单词拆分

322.零钱兑换 题目 思路与解法 class Solution { public:int coinChange(vector<int>& coins, int amount) {// dp数组&#xff1a;// dp[i]: 凑成总金额i&#xff0c;所需的最少硬币个数vector<int> dp(amount 1, INT_MAX);dp[0] 0;for (int i 0; i &l…