当前位置: 首页 > news >正文

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条件对索引字段进行非空检查语句

最近做一个需求&#xff0c;关于SQL高可用优化&#xff0c;需要优化项目中的SQL&#xff0c;提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…...

openharmony源码编译

1. win拷贝数据到虚拟机Ubuntu配置 1.打开终端&#xff0c;更新软件库 sudo apt-get update 2.下载安装open-vm-tools&#xff0c;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》中&#xff0c;塞谬尔和布鲁斯扮演的主角要拆除西蒙所放的炸弹。西蒙喷泉上面有两个壶&#xff0c;容量分别是5加仑和3加仑&#xff0c;向其中一个壶中加入刚好 4 加仑的水&#xff0c;计时器会停止&#xff0c;否则5分钟后会爆炸。 问题:能够安全拆弹…...

Java爬虫:获取SKU详细信息的艺术

在电子商务的世界里&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;是每个商品的唯一标识符&#xff0c;它包含了商品的详细信息&#xff0c;如尺寸、颜色、价格等。对于商家和开发者来说&#xff0c;获取商品的SKU详细信息对于库存管理、订单…...

心理咨询展示网站建设渠道拓展

心理问题长期以来都受到关注&#xff0c;每个城市里也都有相关服务商家&#xff0c;除了进店外&#xff0c;线上也可以开展咨询服务&#xff0c;对需求者来说需要找到靠谱的品牌&#xff0c;而商家也需要触达到更多客户获取转化。 网站是品牌线上工具&#xff0c;利于商家通过…...

naocs注册中心,配置管理,openfeign在idea中实现模块间的调用,getway的使用

一 naocs注册中心步骤 1 nacos下载安装 解压安装包&#xff0c;直接运行bin目录下的startup.cmd 这里双击运行出现问题的情况下 &#xff08;版本低的naocs&#xff09; 在bin目录下 打开cmd 运行以下命令 startup.cmd -m standalone 访问地址&#xff1a; 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长达两个月零五天&#xff01; 001 粗鲁先生Lisp再出发002 懒惰先生的Lisp开发流程003 颠倒先生的数学表达式004 完美先生的完美Lisp005 好奇先生用Lisp来探索Lisp006 好奇先生在Lisp的花园里挖呀挖呀挖007 挑剔先生给出…...

UE5 Windows热更新解决方案思路(HotPatcher+Tomcat+RuntimeFilesDownloader)

以下个人学习笔记。其中必会存在一些问题&#xff0c;仅作参考。本人版本5.1。 参考视频&#xff1a; UE4热更新&#xff1a;HotPatcher插件使用教程_哔哩哔哩_bilibili 3.检查需要下载的版本_哔哩哔哩_bilibili 参考文章&#xff1a; UE 热更新&#xff1a;Questions &…...

进程管理工具:非daemon进程管理工具supervisor

一、非daemon进程管理工具&#xff1a;supervisor Windows安装supervisor https://pypi.org/project/supervisor-win/4.5.0/#files 一&#xff09;进程管理supervisor简介 supervisor是一个 Client/Server模式的系统&#xff0c;允许用户在类unix操作系统上监视和控制多个进程&…...

c++模拟真人鼠标轨迹算法

一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言&#xff0c;利用其高性能和系统级访问能力&#xff0c;开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL&#xff08;动态链接库&#xff09;&#xff0c;可以方便地在不同的编程环境中调用&#xff0c;实现跨语言的兼…...

android12/13/14版本wms最新面试题:dumpsys window和sf一定会一致么?

背景&#xff1a; 近期学员们学习了马哥wms课程后&#xff0c;去参加相关的大厂的framework面试&#xff0c;有一个学员朋友带回来了一个wms相关的面试题&#xff0c;具体面试题描述如下&#xff1a; 问题1 请问wms的window和SurfaceFlinger的Layer有什么关系&#xff1f; 回…...

Python脚本示例,你可以使用这个脚本来自动化登录网站、选择页面元素和提交表单

devtools 元素页面可以选择元素&#xff0c;copy xpath用于查找 python编程&#xff1a;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 集群到单节点环境&#xff08;详细记录一次数据迁移过程&#xff09;之三&#xff1a;在目标服务器上恢复数据 目录 从 Oracle 集群到单节点环境&#xff08;详细记录一次数据迁移过程&#xff09;之三&#xff1a;在目标服务器上恢复数据一、修改参数文件的内容二、…...

相互作用感知的 3D 分子生成 VAE 模型 - DeepICL 评测

DeepICL 是一个基于相互作用感知的 3D 分子生成模型&#xff0c;能够在目标结合口袋内进行相互作用引导的小分子设计。DeepICL 通过利用蛋白质-配体相互作用的普遍模式作为先验知识&#xff0c;在有限的实验数据下也能实现高度的泛化能力。 一、背景介绍 DeepICL 来源于韩国科学…...

Java实现随机抽奖的方法有哪些

在Java中实现随机抽奖的方法&#xff0c;通常我们会使用java.util.Random类来生成随机数&#xff0c;然后基于这些随机数来选择中奖者。以下将给出几种常见的随机抽奖实现方式&#xff0c;包括从数组中抽取、从列表中抽取以及基于权重的抽奖方式。 1. 从数组中抽取 import ja…...

grafana加载缓慢解决方案

背景 目前随着数据和图表的逐渐增多&#xff0c;Grafana 页面加载速度明显变慢&#xff0c;严重影响了用户体验&#xff0c;几次都有骂娘的冲动.&#xff0c;因此我们需要对 Grafana 进行优化&#xff0c;以提升加载性能。 对于速度优化&#xff0c;我们可以从以下方面进行入…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi&#xff08;原名 k8s‑vGPU‑scheduler&#xff09;是一款 CNCF Sandbox 级别的开源 K8s 中间件&#xff0c;通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度&#xff0c;为容器提供统一接口&#xff0c;实现细粒度资源配额…...

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...