Spring Mongo Temple Count()不能执行withHint查询,引发的性能问题

本文深入探讨了在MongoDB查询中遇到的性能瓶颈问题,特别是针对16万条记录、平均对象大小为55.41KB的数据集,揭示了在使用MongoClient进行查询时,如何通过优化查询方式和索引使用,显著提升查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景
MongoDB 数据量 16w 平均对象大小 55.41 KB
使用Mongo Client进行查询时,响应速度是 200ms 左右
接口响应速度600ms~700ms
瓶颈出在哪?

问题排查方案:
1、定位是否是网络问题 ——> 结果:与网络无关
2、定位是否是链路问题 ——> 结果:与负载链路无关
3、排查代码逻辑

  • 步骤一、根据查询条件查询结果数量
  • 步骤二、根据查询条件查询结果

发现步骤一是性能的瓶颈,使用 Mongo Client 进行count查询 (没击中最优索引)响应时间 600ms 左右,review代码

org.springframework.data.mongodb.core.query.Query 构造时,确认在userId存在的情况下击中最优索引


	if(userId!=null&&!userId.trim().isEmpty()) {
			query.addCriteria(Criteria.where("userId").is(userId));
			query.withHint("userId_1_appCode_1_type_1_eventDate_-1");
	}

List<QueryHistory> results = template.find(query, QueryHistory.class);

在以上的情况下,发现count的时候依旧会消耗很长的时间,与 Mongo Client 进行count查询(没击中最优索引)响应时间差不多,看一下源码,发现MongoTemple count的时候,果然直接忽略hint的条件,源码如下:
在这里插入图片描述
当需要击中索引时,应该使用以下的语句进行解决

template.getDb().getCollection("queryHistory").count(object, new DBCollectionCountOptions().hintString("userId_1_appCode_1_type_1_eventDate_-1"));

那么当使用find()方法的时候 query.withHint(“userId_1_appCode_1_type_1_eventDate_-1”); 还能生效吗?再看看源码:

在这里插入图片描述
在使用find()的时候,会检查withHint方法,所以默认的count方法不会击中你定义的最佳索引,但是find方法不会击中你定义的最佳索引,记住了吗?
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值