大数据量条件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.hqwc.cn/news/212353.html

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

相关文章

Mysql数据库 18.Mysql SQL优化

SQL优化 一、插入优化 多条插入语句,影响执行效率 优化方案 1、批量插入: 在一条insert语句中多条数据,但是如果数据量过大,也不能完全使用一条语句语句,建议数据量为一次性插入1000条以下的数据 如果数据量多大&…

【CCF-PTA】第03届Scratch第03题 -- 参观食品厂

参观食品厂 【题目描述】 光明小学定期组织学生参与社会实践,最近的活动主题是参观自动化食品厂。小明看到生产线可以自动筛选罐头重量是否合格,感到十分好奇。回来后,小明准备写一个模拟程序,输入10盒罐头的重量,程…

黑马点评-10实现用户点赞和点赞排行榜功能

用户点赞功能 如果用户只要点赞一次就对数据库中blog表中的liked字段的值加1就会导致一个用户无限点赞 PutMapping("/like/{id}") public Result likeBlog(PathVariable("id") Long id) {// 修改点赞数量,update tb_blog set liked liked 1 where id …

JVMj之console Java监视与管理控制台

jconsole Java监视与管理控制台 1、jconsole介绍 jconsole (java monitoring and management console)是一款基于JMX (Java Management Extensions) 的可视化监视和管理工具。 2、启动jconsole 1、在linux和windwos下通过jconsole启动即可。 2、然后会自动搜索本机运行的…

Zero-Shot Restoration of Back-lit Images Using Deep Internal Learning

ABSTRACT 如何恢复背光图像仍然是一项具有挑战性的任务。该领域最先进的方法基于监督学习,因此通常仅限于特定的训练数据。在本文中,我们提出了一种用于背光图像恢复的“零样本”方案,该方案利用深度学习的力量,但不依赖于任何先…

好工具|datamap,一个好用的地图可视化Excel插件,在Excel中实现地理编码、拾取坐标

在做VRP相关研究的时候,需要对地图数据做很多处理,比如地理编码,根据“重庆市沙坪坝区沙正街174号”这样的一个文本地址知道他的经纬度;再比如绘制一些散点图,根据某个位置的经纬度在地图上把它标注出来。还有有的时候…

标签打印机打印标签时出现,数据处理过程中错误 无法设置项目 图片1的内容无法打印

环境: Win10专业版 NiceLabel Designer 10.1 问题描述: 标签打印机打印标签时出现,数据处理过程中错误 无法设置项目 图片1的内容无法打印 解决方案: 1.删除标签部分文字打印测试 还是一样(未解决) …

数字逻辑电路基础-时序逻辑电路之触发器

文章目录 一、D触发器二、verilog源码三、综合及仿真结果一、D触发器 本文介绍数字逻辑电路中常用的基础时序逻辑电路触发器。它有记忆和存储信息功能,触发器是边沿触发电路。 下图是触发器常用表示方式(时钟上升沿有效): 触发器由两个锁存器组成,前级是主锁存器,后级…

python爬取天气数据并做可视化分析

数据采集逻辑 数据schema 历史天气数据schema { ‘当日信息’:2023-01-01 星期日, 最高气温: 8℃, 最低气温: 5℃, ‘天气’: 多云, 风向信息:北风 3级 } 数据爬取 1.导入库 import numpy as np import pandas as pd import requests from bs4 import BeautifulSoup…

什么是指针碰撞

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

postgresql数据库中update使用的坑

简介 在数据库中进行增删改查比较常见,经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别,oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多,这就导致数据…

LabVIEW中如何达到NI SMU最大采样率

LabVIEW中如何达到NI SMU最大采样率 NISMU的数字化仪功能对于捕获SMU详细的瞬态响应特性或表征待测设备(DUT)响应(例如线性调整率和负载调整率)至关重要。没有此功能,将需要一个外部示波器。 例如,假设在…