大数据量条件SQL查询内存处理方案以及数据过滤算法优化

MySQL是一个广泛使用的关系型数据库管理系统。通过SQL语言进行数据操作和查询,还支持多用户、多线程和分布式操作等功能。

在实际使用中,我们会遇到各种查询条件,如字段名、表名、逻辑运算符、比较运算符、函数等。其中,有些查询条件可能数据量比较大,导致查询速度变慢。下面就来探讨一下如果通过利用内存过滤方式来进行效率优化。

相信各位应用研发小伙伴在日常研发过程中,会经常遇到批量入参场景,需要根据入参信息从数据库获取相应资讯。

常规的做法,大家更多的会采用对入参数据拼接形成执行SQL方式,因为这种方式编写简单,逻辑清晰,但是面临的可能是严重的效能问题。

【场景举例】

接口API - data.get 入参集合ParamLists为1000笔数据,业务逻辑需要根据入参条件批量获取业务数据,并进行业务后续业务处理:

目前应用研发常用方式【SQL拼接】:

当前方式是否存在效能风险?

  • 因为每个条件都需要进行判断,并且需要根据条件进行索引以查找匹配值。如果条件过多,则检索的数据量就会变得非常大,因此查询效率会降低。
  • 查询条件也会影响索引的使用。如果一个查询条件没有索引,那么MySQL就需要扫描整个表来找到匹配值,这也是很耗时,根据以往慢SQL表现,一般耗时会在5s以上。

先可以通过执行计划,判断当前SQL是否有效或者正确的使用到索引。在索引分析时,需要注意的是,并不是SQL有使用到索引就排除索引问题,执行计划索引分析时,需要关注type栏位,判断出当前是否使用到索引,以及索引使用类型,range、index、all都是需要被重点关注的。同时结合ref,key_len栏位判断索引使用是否合理 ,以及extra判断是否有额外操作消耗,比如排序、临时表等。

下面主要说明下,对于这种大量入参拼接查询场景,怎么可以通过内存过滤方式处理。思想是,在一定数据量前提下,利用索引快速查询冗余数据,同​时结合内存快速过滤需要的数据。

(1)数据量评估

评估使用索引栏位查询后的数据量,比如以上案例tenatsid为wo_detail索引栏位,则查看该租户下数据量,如果数据量为2w以内(这里为初略标准,具体可以根据需要输出的栏位以及数据量做内存评估),

则可以考虑使用内存方式解决,如果数据量过大,可能会带来额外的内存或者效能问题。

(2)SQL调整

此时SQL可以调整为:

因为整体数据量少,且能有效使用到索引查询,因此SQL查询效率快,一般在毫秒级,如果索引条件更加精确可以减少更多数据量。但需要注意的是,当前获取到数据集是冗余的,它包含了我们需要的数据集以及其它数据集。接下来就是期望在内存中过滤出我们需要的数据

(3)内存数据过滤优化

到此我们期望从2w笔数据在内存中快速找到1000笔数据信息:

验证数据准备:

1、datas 为数据库读取数据约2w笔

2、param 为入参数据量约1000笔

数据对应关系:1v1,即1个入参条件对应1条数据库数据

(为了测试内存数据过滤优化带来的效能提升,我这里提前将入参和数据库数据按统一条件排序

【常规循环读取】

结果:

过滤耗时约2秒,相对于直接从数据库读取数据,在一定数据量下前提下,内存过滤时间相对更快。

是否有更快的过滤优化方式呢?

当然有

  • 确保入参数据和查找数据的保持相同的栏位顺序,减少无效查找次数。
  • 内循环查找中记录index,减少时间复杂度。

思路如下:

因为ParmList与查询数据保持相同栏位顺序,再过滤过程中,每处理扫描一条数据数组则index++

当进行F10-230807002数据查找时,此时index=2,这时直接从数据库集合中index为2位置开始读取数据。

如此,在1v1数据查询中,可以将时间复杂度从O(N*M)将到O(N),在1vN中数据库集合越大,则提效越明显。

结果:

可以看到耗时时间从2s - >6ms

如果:入参和数据库场景为1vn场景下,这个时候就不能使用break,可以定义一个标识来记录当前入参数据的读取是否结束

结论

      在大数据量拼接SQL查询业务中,根据场景数据量、复杂程度等条件综合判断优化方案,一般场景中数据量不是很大时可以考虑使用【冗余读取+内存过滤优化方案】来处理。如果数据集合过大,可能带来内存和更多的效能问题时,可以考虑采用其他方案,比如分批处理、临时表关联处理等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/164021.shtml

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

相关文章

浅析智慧社区建设趋势及AI大数据监管平台方案设计

一、背景与需求 伴随着社会与经济的发展,人们对生活质量的要求越来越高,与此同时,新兴技术的进步也促进了智慧社区市场的逐步成熟。智慧社区是社区管理的一种新理念,是新形势下城市与社会管理的一种创新模式。 在上海、杭州、深…

在.bashrc文件修改环境变量的做法

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> ~/.bashrc文件是linux下保存环境变量的系统文件。原以为使用sed命令修改.bashrc文件,实际上不行,需要使用echo命令。具体示例如下…

02-详细介绍Java8新特性方法引用,构造引用,数组引用

方法/构造/数组引用 方法引用 当要传递给Lambda体的操作已经有实现的方法时就可以使用方法引用,方法引用和构造器引用就是为了简化Lambda表达式 方法引用可以看做是Lambda表达式深层次的表达,方法引用本质还是Lambda表达式所以也是函数式接口的一个实例通过方法的名字来指向…

小红书关键词搜索商品列表API接口(分类ID搜索商品数据接口,商品详情接口)演示案例

通过关键词搜索商品API接口,电商平台可以为消费者提供一个简单、快捷的商品搜索功能。用户只需输入关键词,就可以得到与该关键词相关的商品列表。关键词搜索商品API接口还可以提供给第三方开发者一个便捷的商品搜索服务。开发者可以利用该接口&#xff0…

Mac安装配置typescript及在VSCode上运行ts

一、Mac上安装typescript sudo npm install -g typescript 测试一下:出现Version则证明安装成功 tsc -v 二、在VSCode上运行 新建一个xxx.ts文件,测试能否运行 console.log("helloworld") 运行报错:ts-node: command not…

后渗透持久性-– 服务控制管理器

执行以下命令将快速检索服务控制管理器实用程序的 SDDL 权限。 sc sdshow scmanager服务控制管理器 – 安全描述符 PowerShell 还可用于枚举所有用户组的 SDDL 权限并将其转换为可读格式。 $SD Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\Schedule\S…

shell 条件语句 if case

目录 测试 test测试文件的表达式 是否成立 格式 选项 比较整数数值 格式 选项 字符串比较 常用的测试操作符 格式 逻辑测试 格式 且 (全真才为真) 或 (一真即为真) 常见条件 双中括号 [[ expression ]] 用法 &…

美国服务器在大陆连不上怎么回事?

​  在租用任何美国服务器之前,都需要先搞清楚一些使用问题,毕竟服务器能够不间断地访问也是站在们所期望的。但有时,美国服务器网站或许也会突然出现在大陆打不开的情况,在面临这种情况时,我们应该怎么做? 查看连不…

【史上最细教程】服务器MySQL数据库完成主从复制

文章目录 MySQL完成主从复制教程准备:原理:步骤: 推荐文章 MySQL完成主从复制教程 主从复制(也称 AB 复制)就是将一个服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从…

Java飞翔的鸟

创建三个包,存放代码。把图片放进文件中 APP包(运行) GameApp类 package APP; import mian.GameFrame;public class GameApp {public static void main(String[] args) {new GameFrame();} } mian包(主内容) Barri…

python获取json所有节点和子节点

使用python获取json的所有父结点和子节点 并使用父节点加下划线命名子节点 先展示一段json代码 {"level1": {"level2": {"level3": [{"level4": "4value"},{"level4_2": "4_2value"}]},"level2_…

电力行业的智能调度:数字孪生技术

随着科技的发展,数字孪生技术正逐渐渗透到各个行业领域,其中包括电力行业。数字孪生技术为电力行业带来了前所未有的机遇,使得电力系统的运行更加高效、安全和可持续。本文借用山海鲸可视化软件几个电力行业数字孪生案例探讨数字孪生技术在电…

介绍几种Go语言开发的IDE

文章目录 1.前言2.几种ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.总结写在最后 1.前言 Go语言作为一种新兴的编程语言,近年来受到了越来越多的关注。 它以其简洁、高效和并发性能而闻名,被广…

Jmeter 压测保姆级入门教程

1、Jmeter本地安装 1.1、下载安装 软件下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/ 选择一个压缩包下载即可 然后解压缩后进入bin目录直接执行命令jmeter即可启动 1.2 修改语言 默认是英文的,修改中文,点击…

关于解决C# WinForm中Chart控件增删数据时报错的解决方法

1.报错代码 System.InvalidOperationExceptionHResult=0x80131509Message=集合已修改;可能无法执行枚举操作。具体报错表现为,在Application.Run(Form1())中断。 2.解决方法 这个错误通常是由于在枚举集合时对集合进行了修改而引起的。在修改完chart控件中的内容后,可能会…

Linux---常用命令汇总

文章目录 关于目录操作的命令ls/llcdpwdmkdir 关于文件操作的命令touchechocatrmmvcpvim 关于查询操作的命令greppsnetstat 关于目录操作的命令 ls/ll ls : 列出当前目录下的目录和文件(以行的展示形式) ll : 列出当前目录下的目录和文件&…

Django之Cookie与Session,CBV加装饰器

前言 会话跟踪技术 在一个会话的多个请求中共享数据,这就是会话跟踪技术。例如在一个会话中的请求如下:  请求银行主页; 请求登录(请求参数是用户名和密码);请求转账(请求参数与转账相关的数…

Thread类常用成员方法

点击链接返回标题-> Java线程的学习-CSDN博客 目录 前言 有关线程名字的成员方法: String getName() void setName(String name) Thread(String name) 获取线程对象的成员方法: static Thread currentThread() 让线程睡眠的成员方法&#xff1…

时间序列分析算法的概念、模型检验及应用

时间序列分析是一种用于研究随时间变化的数据模式和趋势的统计方法。这类数据通常按照时间顺序排列,例如股票价格、气温、销售额等。时间序列分析的目标是从过去的观测中提取信息,以便预测未来的趋势。 以下是关于时间序列分析的一些重要概念、模型检验…

python 数据类型之集合

常见的数据类型: int,整数类型(整形)bool,布尔类型str,字符串类型list,列表类型tuple,元组类型dict,字典类型,一个容器且元素必须是键值对。set,…