通过内存去重替换SQL中distinct,优化SQL查询效率

一、背景

运维同事收到了生产环境的一条慢SQL告警,执行时间达到了10+秒,分析了业务场景,属于正常查询业务,而且SQL语句是上个版本新增的需求,于是在慧眼上,将SQL链路截图发给了开发进行修复。

二、分析

通过对SQL的执行索引情况分析,发现最后耗时在了distinct阶段,于是就想办法将去重放在内存中进行优化。

三、方案

1:SQL整改

优化前SQL

sql 复制代码
select distinct color,name .....

优化后SQL

sql 复制代码
select color,name .....

2:重写hashcode和equals方法

这里用Car举例,只是为了还原业务场景

java 复制代码
public class Car{
	private String color;
	private String name;
	@override
	public boolean equals(Object obj){
    	if(this == obj){
    		return true;
    	} 
    	if(obj == null || getClass() != obj.getClass()){
			return false;
		}
		Car car = (Car) obj;
		return StringUtils.equals(car.getColor(),this.color)
		       && StringUtils.equals(car.getName(),this.name);
    }

   @Override
   public int hashCode(){
		return Objects.hash(color,name);
   }
}

优化后,去掉了SQL中的distinct。

分批查询数据,最后对结果去重。

java 复制代码
List<Car> result = new ArrayList<>();
ListGroupUtils.groupListBySize(resultList,1000).forEach(
	list -> result.addAll(xxDao.findXXX(list))
);
return result.stream().distinct().collect(Collectors.toList());
相关推荐
uElY ITER4 分钟前
VS与SQL Sever(C语言操作数据库)
c语言·数据库·sql
小锋java12344 分钟前
LangChain4j 来了,Java AI智能体开发再次起飞。。。
java·人工智能·后端
敖正炀10 分钟前
BlockingQueue 详解
java
SHoM SSER15 分钟前
SQL之CASE WHEN用法详解
数据库·python·sql
likerhood21 分钟前
java中的return this、链式编程和Builder模式
java·开发语言
spring29979221 分钟前
Spring Boot 实战篇(四):实现用户登录与注册功能
java·spring boot·后端
cyber_两只龙宝35 分钟前
【Oracle】Oracle之SQL的聚合函数和分组
linux·运维·数据库·sql·云原生·oracle
未来转换1 小时前
基于A2A协议的生产应用实践指南(Java)
java·开发语言·算法·agent
后端漫漫1 小时前
Redis 配置文件与服务功能
java·redis
Dwzun1 小时前
基于Java+SpringBoot+Vue的校园二手物品置换系统设计与实现【附源码+文档+部署视频+讲解】
java·开发语言·spring boot