SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句
最近做一个需求,关于SQL高可用优化,需要优化项目中的SQL,提升查询效率。
SQL高可用优化
- 一、优化SQL包含distinct场景
- 二、优化SQL中Where条件中索引字段是否为NULL
- 三、代码验证
- 1. NodeMapper
- 2. NodeService
- 3. NodeController
- 4.数据库数据
- 5.项目结构及源码
一、优化SQL包含distinct场景
1.1 原因
数据量:数据量越大,DISTINCT操作需要的时间和资源越多。
索引:如果查询中涉及到的列没有索引,数据库引擎可能需要全表扫描来执行DISTINCT操作,导致性能下降。
数据分布:如果数据分布不均匀,即某些值出现频率较高,DISTINCT操作会更耗时。
1.2 优化措施
(1)可以利用Set集合进行存储,Set集合会自动对数据进行去重
(2)可以用lambda表达式中distinct()方法进行去重
二、优化SQL中Where条件中索引字段是否为NULL
1.1 原因
对索引字段进行非空检查时,数据库可能会选择全表扫描而不是使用索引,因为索引中不包含NULL值,这会降低查询性能。
1.2 优化措施
在service层利用lambda表达式中进行去重
三、代码验证
1. NodeMapper
@DS("mysql1")
@Repository("NodeMapper")
public interface NodeMapper extends BaseMapper<NodeVo> {@Select("select distinct esn from node_vo where name like 'GTS5900%'")List<String> getNodeListByName(String name);@Select("select esn from node_vo where name like 'GTS5900%'")Set<String> getNodeSetByName(String name);@Select("select esn from node_vo where name like 'GTS5900%'")List<String> getNodeListNoDistinctByName(String name);@Select("select esn from node_vo where esn like 'msk00%' and name != ''")List<NodeVo> getNodeListNoEmptyNameByEsn(String esn);@Select("select esn from node_vo where esn like 'msk00%'")List<NodeVo> getNodeListByEsn(String esn);
}
2. NodeService
@Service
public class NodeService {@Autowiredprivate NodeMapper nodeMapper;public List<String> getNodeListByName(String name){// 通过sql语句中distinct去重return nodeMapper.getNodeListByName(name);}public Set<String> getNodeSetByName(String name){// 通过set集合去重return nodeMapper.getNodeSetByName(name);}public List<String> getNodeListNoDistinctByName(String name){// 通过xxx.stream().distinct()去重List<String> nodeListNoDistinctByName = nodeMapper.getNodeListNoDistinctByName(name);return nodeListNoDistinctByName.stream().distinct().collect(Collectors.toList());}public List<NodeVo> getNodeListNoEmptyNameByEsn(String esn){return nodeMapper.getNodeListNoEmptyNameByEsn(esn);}public List<NodeVo> getNodeListByEsn(String esn){return nodeMapper.getNodeListByEsn(esn);}
}
3. NodeController
@RestController
public class NodeController {@Autowiredprivate NodeService nodeService;@RequestMapping("getNodeListByName")public List<String> getNodeListByName(String name) {// 通过sql语句中distinct去重return nodeService.getNodeListByName(name);}@RequestMapping("getNodeSetByName")public Set<String> getNodeSetByName(String name) {// 通过set集合去重return nodeService.getNodeSetByName(name);}@RequestMapping("getNodeListNoDistinctByName")public List<String> getNodeListNoDistinctByName(String name) {// 通过xxx.stream().distinct()去重return nodeService.getNodeListNoDistinctByName(name);}@RequestMapping("getNodeListNoEmptyNameByEsn")public List<String> getNodeListNoEmptyNameByEsn(String esn) {// 通过sql过滤name不为null的值List<NodeVo> nodeListNoEmptyNameByEsn = nodeService.getNodeListNoEmptyNameByEsn(esn);return nodeListNoEmptyNameByEsn.stream().map(NodeVo::getEsn).collect(Collectors.toList());}@RequestMapping("getNodeListByEsn")public List<String> getNodeListByEsn(String esn) {// 通过xxx.stream().filter()过滤name不为null的值List<NodeVo> nodeListByEsn = nodeService.getNodeListByEsn(esn);return nodeListByEsn.stream().map(NodeVo::getEsn).filter(Objects::nonNull).collect(Collectors.toList());}
}
4.数据库数据

5.项目结构及源码
源码下载地址demo-springboot-mybatisplus,欢迎Star !

由于项目集成了SaToken框架,需要先登录,再访问测试NodeController接口


相关文章:
SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句
最近做一个需求,关于SQL高可用优化,需要优化项目中的SQL,提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…...
openharmony源码编译
1. win拷贝数据到虚拟机Ubuntu配置 1.打开终端,更新软件库 sudo apt-get update 2.下载安装open-vm-tools,open-vm-tools-desktop sudo apt-get install open-vm-tools open-vm-tools-desktop 3.重启 sudo reboot 2.编译环境配置 1.设置环境脚本…...
H.264编解码工具 - NVIDIA CUDA
一、简介 NVIDIA CUDA编解码是一项采用NVIDIA图形处理器(GPU)来加速视频编码和解码的技术。CUDA(Compute Unified Device Architecture)是一种并行计算平台和编程模型,允许开发者使用GPU来进行通用计算。 优点: 加速编解码速度:CUDA编解码利用GPU的并行处理能力,可以…...
数学建模小练习
题目B 电影《虎胆龙威 3》中,塞谬尔和布鲁斯扮演的主角要拆除西蒙所放的炸弹。西蒙喷泉上面有两个壶,容量分别是5加仑和3加仑,向其中一个壶中加入刚好 4 加仑的水,计时器会停止,否则5分钟后会爆炸。 问题:能够安全拆弹…...
Java爬虫:获取SKU详细信息的艺术
在电子商务的世界里,SKU(Stock Keeping Unit,库存单位)是每个商品的唯一标识符,它包含了商品的详细信息,如尺寸、颜色、价格等。对于商家和开发者来说,获取商品的SKU详细信息对于库存管理、订单…...
心理咨询展示网站建设渠道拓展
心理问题长期以来都受到关注,每个城市里也都有相关服务商家,除了进店外,线上也可以开展咨询服务,对需求者来说需要找到靠谱的品牌,而商家也需要触达到更多客户获取转化。 网站是品牌线上工具,利于商家通过…...
naocs注册中心,配置管理,openfeign在idea中实现模块间的调用,getway的使用
一 naocs注册中心步骤 1 nacos下载安装 解压安装包,直接运行bin目录下的startup.cmd 这里双击运行出现问题的情况下 (版本低的naocs) 在bin目录下 打开cmd 运行以下命令 startup.cmd -m standalone 访问地址: http://localh…...
先进封装技术 Part02---TSV科普
一、引言 随着电子设备向更小型化、更高性能的方向发展,传统的芯片互连技术已经无法满足日益增长的需求。在这样的背景下,TSV(Through-Silicon Via,硅通孔)技术应运而生,成为先进封装技术中的核心之一。 如果我们看大多数主板,可以看到两件事:第一,芯片之间的大多数连…...
【数据挖掘】2023年 Quiz 1-3 整理 带答案
目录 Quiz 1Quiz 2Quiz 3Quiz 1 Problem 1(30%). Consider the training data shown below. Here, A , B A, B A,B, and...
老古董Lisp实用主义入门教程(12):白日梦先生的白日梦
白日梦先生的白日梦 白日梦先生已经跟着大家一起学Lisp长达两个月零五天! 001 粗鲁先生Lisp再出发002 懒惰先生的Lisp开发流程003 颠倒先生的数学表达式004 完美先生的完美Lisp005 好奇先生用Lisp来探索Lisp006 好奇先生在Lisp的花园里挖呀挖呀挖007 挑剔先生给出…...
UE5 Windows热更新解决方案思路(HotPatcher+Tomcat+RuntimeFilesDownloader)
以下个人学习笔记。其中必会存在一些问题,仅作参考。本人版本5.1。 参考视频: UE4热更新:HotPatcher插件使用教程_哔哩哔哩_bilibili 3.检查需要下载的版本_哔哩哔哩_bilibili 参考文章: UE 热更新:Questions &…...
进程管理工具:非daemon进程管理工具supervisor
一、非daemon进程管理工具:supervisor Windows安装supervisor https://pypi.org/project/supervisor-win/4.5.0/#files 一)进程管理supervisor简介 supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程&…...
c++模拟真人鼠标轨迹算法
一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言,利用其高性能和系统级访问能力,开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL(动态链接库),可以方便地在不同的编程环境中调用,实现跨语言的兼…...
android12/13/14版本wms最新面试题:dumpsys window和sf一定会一致么?
背景: 近期学员们学习了马哥wms课程后,去参加相关的大厂的framework面试,有一个学员朋友带回来了一个wms相关的面试题,具体面试题描述如下: 问题1 请问wms的window和SurfaceFlinger的Layer有什么关系? 回…...
Python脚本示例,你可以使用这个脚本来自动化登录网站、选择页面元素和提交表单
devtools 元素页面可以选择元素,copy xpath用于查找 python编程:1、浏览器登录https://58.xxx/ 账号:xxx 密码:FN123456 2、选择“技能训练” 3、选择“云网智能运维员培训相关资料” 4、选择“L1-Linux操作系统与运维题库” 5、依次选择1-50题目&#x…...
安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…...
从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之三:在目标服务器上恢复数据
从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之三:在目标服务器上恢复数据 目录 从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之三:在目标服务器上恢复数据一、修改参数文件的内容二、…...
相互作用感知的 3D 分子生成 VAE 模型 - DeepICL 评测
DeepICL 是一个基于相互作用感知的 3D 分子生成模型,能够在目标结合口袋内进行相互作用引导的小分子设计。DeepICL 通过利用蛋白质-配体相互作用的普遍模式作为先验知识,在有限的实验数据下也能实现高度的泛化能力。 一、背景介绍 DeepICL 来源于韩国科学…...
Java实现随机抽奖的方法有哪些
在Java中实现随机抽奖的方法,通常我们会使用java.util.Random类来生成随机数,然后基于这些随机数来选择中奖者。以下将给出几种常见的随机抽奖实现方式,包括从数组中抽取、从列表中抽取以及基于权重的抽奖方式。 1. 从数组中抽取 import ja…...
grafana加载缓慢解决方案
背景 目前随着数据和图表的逐渐增多,Grafana 页面加载速度明显变慢,严重影响了用户体验,几次都有骂娘的冲动.,因此我们需要对 Grafana 进行优化,以提升加载性能。 对于速度优化,我们可以从以下方面进行入…...
一套万能的异步处理方案!(珍藏版)
前言 良好的系统设计必须要做到开闭原则,随着业务的不断迭代更新,核心代码也会被不断改动,出错的概率也会大大增加。但是大部分增加的功能都是在扩展原有的功能,既要保证性能又要保证质量,我们往往都会使用异步线程池…...
Windows自定义部署神器:从零开始的安装介质制作指南
Windows自定义部署神器:从零开始的安装介质制作指南 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 你是否…...
Swin2SR效果实测:处理含文字区域图像时的可读性保持能力专项测试
Swin2SR效果实测:处理含文字区域图像时的可读性保持能力专项测试 1. 测试背景与目的 在日常工作和生活中,我们经常会遇到一些低分辨率、模糊不清的图片,特别是那些包含文字的图像。无论是扫描的文档、网页截图,还是老照片中的文…...
多宽带联网(五) OpenWrt中MWAN3高级策略分流实战(游戏加速、视频优化场景)
1. MWAN3策略分流的核心价值 家里拉了两条宽带却发现刷视频卡、打游戏延迟高?这种情况我遇到过太多次了。去年给朋友家调试网络时,他同时接了电信和联通两条200M宽带,但看4K视频还是缓冲,玩外服游戏延迟总在200ms以上。后来用Open…...
别再只会看原理图了!用Multisim仿真带你深入理解运放的“虚短虚断”与反馈
用Multisim仿真破解运放"虚短虚断"的底层逻辑 在电子电路设计中,运算放大器就像一位沉默的魔术师,用"虚短"和"虚断"两个基本概念演绎着各种精妙的信号处理戏法。但很多工程师在学习阶段只是机械记忆这两个术语,…...
沉浸式翻译扩展常见问题解决方案
沉浸式翻译扩展常见问题解决方案 【免费下载链接】immersive-translate 沉浸式双语网页翻译扩展 , 支持输入框翻译, 鼠标悬停翻译, PDF, Epub, 字幕文件, TXT 文件翻译 - Immersive Dual Web Page Translation Extension 项目地址: https://gitcode.c…...
Czkawka:智能存储管理的5个核心解决方案
Czkawka:智能存储管理的5个核心解决方案 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 1.0 现象剖析:数字存储管理的现实困…...
3个突破限制步骤:res-downloader让网络资源获取变得无拘无束
3个突破限制步骤:res-downloader让网络资源获取变得无拘无束 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数…...
Qt Network 模块中的 TCP/IP 网络编程详解
Qt 是一个功能强大的跨平台 C 框架,其 Qt Network 模块为应用程序提供了丰富的网络通信能力,极大地简化了网络编程的复杂性。在众多网络协议中,TCP/IP 协议栈是互联网通信的基础,Qt Network 提供了 QTcpSocket 和 QTcpServer 等类…...
重装系统后的环境快速恢复:包含BERT模型部署的自动化脚本
重装系统后的环境快速恢复:包含BERT模型部署的自动化脚本 重装系统,对开发者来说,就像一场“数字大扫除”。清爽是清爽了,但看着空空如也的终端和待部署的一长串服务列表,那种从头再来的疲惫感瞬间涌上心头。尤其是当…...
