常见提高SQL执行效率示例

news/2024/11/17 5:36:22/

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_idFROM ordersWHERE order_date > '2022-01-01'
);
//优化后查询语句
SELECT customers.*
FROM customers
JOIN (SELECT DISTINCT customer_idFROM ordersWHERE 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.ppmy.cn/news/59160.html

相关文章

香港top5功能完善炒期货投资app软件排名(最新评测)

选择一款合适的炒期货投资软件对于投资者来说至关重要。考虑软件稳定、交易流畅度、交易品种、数据可靠性、而且还要考虑费用等多方面因素。 首先&#xff0c;软件的稳定性很重要。选用稳定性高的软件可以避免如断电、手机或电脑死机等突发状况&#xff0c;保证交易安全顺畅。…

Vue电商项目--axios二次封装

postman测试接口 刚刚经过postman工具测试&#xff0c;发现接口果然发生了改变。 新的接口为http://gmall-h5-api.atguigu.cn 如果服务器返回的数据code字段200&#xff0c;代表服务器返回数据成功 整个项目&#xff0c;接口前缀都有/api字样 axios二次封装 XmlHttpRequ…

掌握 Python 接口自动化测试理论,深度解读测试框架源码

目录&#xff1a;导读 引言 一、什么是接口测试、为什么要做接口测试 1、什么是接口测试 2、为什么要做接口测试 二、接口测试的流程 1、接口测试的流程 2、为什么要写测试用例 3、接口测试设计要点 三、python接口自动化-requests的应用 1、requests简介 2、reques…

代码随想录算法训练营第五十二天 |动态规划 part13

300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序…

Linux 用户管理与文件权限

Linux 是一个多用户系统&#xff0c;它允许多个用户同时登陆主机&#xff0c;并为他们分配不同的资源和工作环境进行使用。当然&#xff0c;不同的用户都有文件的私有需求&#xff0c;所以设置不同用户文件的权限管理十分重要。 01 用户与用户组 Linux 中一般将文件访问权限的…

LeetCode 1376. Time Needed to Inform All Employees【自顶向下,自底向上(记忆化搜索+空间优化+迭代)】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

原生OpenFeign相较于传统HTTP工具的优化和原理

文章目录 1.HTTP工具使用流程及问题1.1 使用OkHttp3流程示例1.2 存在的两大问题 2.OpenFeign的优化3.OpenFeign实现原理3.1 使用Feign构造动态代理对象3.2 Feign动态代理的实现原理 本篇介绍的是springcloud-openfeign的底层框架io.github.openfeign&#xff0c;重点不是框架如…

介绍一款优秀的网址导航,可以部署到自己公司内部:hexo-theme-webstack

GitHub - HCLonely/hexo-theme-webstack: A hexo theme based on webstack. | 一个基于webstack的hexo主题。 中文文档 A Hexo theme based on WebStackPage. Installation hexo > 4.0 git clone https://github.com/HCLonely/hexo-theme-webstack themes/webstack hexo …