常见提高SQL执行效率示例

news2024/11/16 0:43:02

1、减少与数据库的交互:

        当传参是一个list集合时,通过遍历查询数据库会造成数据库压力过大,这样查询效率就比较低,应该减少与数据库的交互来提高查询效率:(这里的objId为“ljydl”,"ljtpfl")

QueryWrapper<IndexInfoDto> ew = new QueryWrapper<>();
ew.in("i.OBJ_ID",qo.getObjIds());
List<IndexInfoDto> reatimePowerInfo = baseMapper.getIndexInfoById(ew);
Map<String, List<IndexInfoDto>> map=reatimePowerInfo.stream().collect(Collectors.groupingBy(IndexInfoDto::getObjId));
@Select("select i.OBJ_ID,i.OBJ_NAME,i.OBJ_VALUE from index_info i ${ew.customSqlSegment}")
List<IndexInfoDto> getIndexInfoById(@Param(Constants.WRAPPER) QueryWrapper<IndexInfoDto> ew);

 2、优化查询条件:

        在对同一个表使用多个条进行查询时,应将条件强的,即按照条件返回结果集的行数少的条件放在前面。减少下一个查询条件进行查询时。扫描的行数,提高查询效率。

//原始语句
SELECT *
FROM orders
WHERE order_date > '2022-01-01' AND order_status = 'completed';
//优化后的查询语句
SELECT *
FROM orders
WHERE order_status = 'completed' AND order_date > '2022-01-01';

3、小表驱动大表,用小表的数据集驱动大表的数据集:

        假如有order和user两张表,其中order表有10000条数据,而user表有100条数据。此时我们想要查询所有有效的用户下过的订单列表。

(1)可以使用in关键字实现:

select 字段,字段,字段,字段 from order where user_id in (select id from user where status=1)

(2)使用exists关键字实现:

select  字段,字段,字段,字段 字段,字段,字段,字段 字段,字段,字段,字段 from order 
where exists (select 1 from user where order.user_id = user.id and status=1)

前面提到的这种业务场景,使用in关键字去实现业务需求,更加合适,原因如下:

        如果sql语句中包含了in关键字,则它会优先执行in里面的子查询语句,然后再执行in外面的语句。如果in里面的数据量很少,作为条件查询速度更快。

        如果sql语句中包含了exists关键字,它优先执行exists左边的语句(即主查询语句)。然后把它作为条件,去跟右边的语句匹配。如果匹配上,则可以查询出数据。如果匹配不上,数据就被过滤掉了。

        这个需求中,order表有10000条数据,而user表有100条数据。order表是大表,user表是小表。如果order表在左边,则用in关键字性能更好。

in 适用于左边大表,右边小表。

exists 适用于左边小表,右边大表。

4、使用 JOIN 替代子查询:

//原查询语句
SELECT *
FROM customers
WHERE customer_id IN (
  SELECT customer_id
  FROM orders
  WHERE order_date > '2022-01-01'
);
//优化后查询语句
SELECT customers.*
FROM customers
JOIN (
  SELECT DISTINCT customer_id
  FROM orders
  WHERE order_date > '2022-01-01'
) AS recent_orders
ON customers.customer_id = recent_orders.customer_id;

5、避免使用 SELECT *

        在实际业务场景中,可能我们真正需要使用的只有其中一两列。查了很多数据,但是不用,白白浪费了数据库资源,比如:内存、cpu或者IO的数据传输时间。

        select *不会走覆盖索引,会出现大量的回表操作,而从导致查询sql的性能很低。

6、批量操作

        如果有一批数据经过业务处理之后,需要插入数据,该怎么办,我们不可能通过循环一条条的插入数据库,因为每次远程请求数据库,是会消耗一定性能的。而如果我们的代码需要请求多次数据库,才能完成本次业务功能,势必会消耗更多的性能。优化方式如下:

orderMapper.insertBatch(List<User> users): 

insert into order(id,code,user_id)  values(123,'001',100),(124,'002',100),(125,'003',101);

<insert id="insertOrderList">
        insert into order(id,code,user_id) values
        <foreach item="item" index="index" collection="list" separator=",">
            (#{item.id},#{item.code},#{item.user_id})
        </foreach>
</insert>

7、多用limit

        只返回我们想要的某一条或者某几条数据即可。在删除或者修改数据时,为了防止误操作,导致删除或修改了不相干的数据,也可以在sql语句最后加上limit。

8、提升group  by 的执行效率

        我们有很多业务场景需要使用group by关键字,它主要的功能是去重和分组。通常它会跟having一起配合使用,表示分组后再根据一定的条件过滤数据。

select user_id,user_name from order 
group by user_id having user_id <= 200; 

        这种写法性能不好,它先把所有的订单根据用户id分组之后,再去过滤用户id大于等于200的用户。分组是一个相对耗时的操作,我们可以先缩小数据的范围之后,再分组,这样执行效率就会进一步提高。

select user_id,user_name from order
where user_id <= 200 
group by user_id 

        其实这是一种思路,不仅限于group by的优化。我们的sql语句在做一些耗时的操作之前,应尽可能缩小数据范围,这样能提升sql整体的性能。

9、插入更新操作(存在即更新、反之则插入)

@Insert("INSERT INTO info(OBJ_ID, CAPACITY) VALUES (#{map.objId},#{map.capacity}) ON DUPLICATE KEY UPDATE CAPACITY = values(CAPACITY)" )
int insertOrUpdateInfo(@Param("map") Map<String,Object> map);

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

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

相关文章

JavaScript全解析——本地存储的概念、用法详解

本地存储概念&#xff1a; 就是浏览器给我们提供的可以让我们在浏览器上保存一些数据 常用的本地存储 localStorage sessionStorage localStorage 特点: 1.长期存储,除非手动删除否则会一直保存在浏览器中&#xff0c;清除缓存或者卸载浏览器也就没有了 2.可以跨页面通讯,…

如何设计出结构清晰布局漂亮的SWC结构图

我们都知道AUTOSAR的设计理念是自顶向下的设计,并且现在使用的很多AUTOSAR工具链对于SWC的设计都支持模型设计,以Vector Developer工具为例,假设我们不调整Composition,其结构图显示将会比较乱,比如如下这个样子,结构图中ports关系不清晰,位置重叠,布局不够清晰,有些朋…

二维码在设备管理中的应用

对设备进行巡检是工厂日常管理中必不可少的工作之一&#xff0c;从前很多工厂使用纸质记录打钩的方式进行设备巡检&#xff0c;但纸质巡检单不易保存也不方便进行查阅或汇总&#xff0c;除此之外光靠打钩很难保证巡检的真实性&#xff0c;不能起到防假检的功能。 为了让设备巡…

vue3+Typescript实现路由标签页和面包屑

文章目录 在vue中实现路由标签页和面包屑需求分析最终效果实现步骤第一步&#xff1a;创建路由标签组件和面包屑第二步&#xff1a;创建路由标签数组第三步&#xff1a;监听路由变化并自动添加新标签第四步&#xff1a;处理关闭标签事件第五步&#xff1a;当前路由标题同步面包…

Oracle RAC 19c集群搭建指南:实现高可用、高性能的数据库集群(超详细)

Oracle RAC 19c集群搭建指南&#xff1a;实现高可用、高性能的数据库集群&#xff08;超详细&#xff09; 1.新建节点 因为rac集群使用的是共享盘&#xff08;esxi设置共享盘步骤如下&#xff09;&#xff1a; 首先添加一个iSCSI控制器SCSI总线共享选择虚拟添加硬盘&#xf…

java:fastjson,jackson自定义反序列化器设计暨jackson反序列化时出现StackOverflowError异常的原因分析

问题描述 如下是一个Java Bean类&#xff0c;这是我的sql2java工具根据数据库表自动生成的对应表记录的Java类。 与之对应的数据库表定义如下&#xff1a; CREATE TABLE IF NOT EXISTS dc_device_channel (device_id int NOT NULL COMMENT XNAME:设备IDX,sid …

一种具备过载检测和打嗝式保护功能的MBUS主机电路

关于MBUS电路原理和简化电路见本篇文章&#xff0c; MBUS主机端简化版电路设计_Tech-Wang的博客-CSDN博客https://blog.csdn.net/jsf120/article/details/123378064?spm1001.2014.3001.5502 上篇中的电路已经验证通过并在产品中实际应用&#xff0c;本篇在此基础上增加了打嗝…

itop-3568开发板驱动学习笔记(25)设备树(四)GPIO 实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 GPIO 控制器必要属性其他属性 指定 GPIO 引脚 和时钟类似&#xff0c;GPIO 在设备树中也存在两层定义&#xff0c;首先是 GPIO 控制器&#xff0c;这部分由芯片原厂工程师编写&#xff0c;相当于 GPIO 底层…

恺撒密码太简单?这样一改,秒变地狱级难度(37)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 看过上一篇文章的朋友&#xff0c;可能觉得这样加密&#xff0c;未免太简单了吧&#xff1f; 一共26个字母&#xf…

【java】一文让你了解透彻Java中的IO模型

文章目录 前言一、什么是IO二、常见的IO模型BIO&#xff08;Blocking IO&#xff09;如何优化NIO的面世 三、NIO&#xff08;Non-blocking/New IO&#xff09;同步非阻塞IO模型IO多路复用模型Java中的NIO 四、AIO&#xff08;Asynchronous IO&#xff09;总结 前言 本文只是说…

不要一昧的给孩子做骨密度检查,这些情况才要做

国内&#xff0c;骨密度检测应用非常广泛。也成了很多医院儿科常规的体检项目之一。而在儿科领域&#xff0c;对骨密度检查的必要性、临床参考意义一直颇有争议。 有专家说&#xff0c;“孩子需要及时检测骨密度&#xff0c;但是要用科学有效的检测方式……只有双能X线的检测方…

BetaFlight统一硬件配置文件研读

BetaFlight统一硬件配置文件研读 1. 源由2. 分析2.1 硬件SOC2.2 统一配置文件2.3 cli命令2.4 板级配置主要命令2.4.1 board_name2.4.2 manufacturer_id2.4.3 resource2.4.4 timer2.4.5 dma2.4.6 serial2.4.7 set2.4.8 feature 3. 实例研读3.1 C遗留配置3.2 BoardName - AOCODAR…

asp.net+C#基于web的失物招领系统ccA1A9程序

根据分析&#xff0c;该系统应该有二个角色&#xff1a;管理员、注册用户。系统需要赋予他们对应的功能和权限&#xff0c;具体如下&#xff1a; 管理员具有&#xff1a;管理管理注册用户、管理新闻模块、管理留言的功能和权限。 具有&#xff1a;浏览新闻、管理失物信息、参与…

【Linux内幕】DMA原理

1.前言 I/O设备与主存信息传送的控制方式分为程序轮询、中断、DMA、RDMA等。 2.DMA介绍 DMA&#xff0c;全称Direct Memory Access&#xff0c;即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间&#xff0c;提供在外设和存储器之间或者存储器和存储器之…

GAT1400-视图库标准

一、简述&#xff1a; GA/T 1400是于2017年首次发布关于图片、视频片段、文件等属性对象的传输协议。 GA/T 1400《公安视频图像信息应用系统》分成4个部分&#xff1a; 第一部分–通用技术要求&#xff1b; 第二部分–应用平台技术要求&#xff1b; 第三部分–数据库技术要…

前端学习之使用JavaScript

前情回顾&#xff1a;网页布局 JavaScript 简介 avaScript诞生于1995年&#xff0c;它的出现主要是用于处理网页中的前端验证。所谓的前端验证&#xff0c;就是指检查用户输入的内容是否符合一定的规则。比如&#xff1a;用户名的长度&#xff0c;密码的长度&#xff0c;邮箱的…

刘强:作业帮给OceanBase提了九条意见

3 月 25 日&#xff0c;第一届 OceanBase 开发者大会在北京举行&#xff0c; 作业帮数据库架构师刘强为大家带来了《作业帮基于 OceanBase 的 HTAP 实践》的分享 &#xff0c;为大家介绍了 OceanBase 上线作业帮半年来的体验与心得。 以下内容由大会演讲整理而成&#xff1a; …

提示工程玩转 ChatGPT

Prompt engineering is the skill of the future. 目录&#xff1a; 1. 简介 (Introduction) 2. 提示指南 (Prompt Guidelines) 2.1 指令要清晰明确 2.2 给模型时间思考 3. 迭代提示 (Iterative Prompt) 3.1 迭代过程 3.2 案例展示 4. 文本概括 (Text Summarization) 4.1 单文本…

五个有用的工具帮助您提高代码质量

前言 对于开发人员而言&#xff0c;代码质量一直是一个非常重要的话题。高质量的代码不仅可以提高应用程序的性能&#xff0c;还可以减少代码错误和维护成本。然而&#xff0c;如何确保代码质量呢&#xff1f;下面介绍五个有用的工具&#xff0c;可以帮助您提高代码质量。 So…

SLAM论文速递:SLAM—— NICER-SLAM: RGB SLAM的神经隐式场景编码—5.04(1)

论文信息 题目&#xff1a; NICER-SLAM:Neural Implicit Scene Encoding for RGB SLAM NICER-SLAM: RGB SLAM的神经隐式场景编码论文地址&#xff1a; https://arxiv.org/pdf/2302.03594.pdf发表期刊&#xff1a; Computer Vision and Pattern Recognition (cs.CV)标签 xxxx…