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

问题背景
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的条件,源码如下:
Spring Mongo Temple Count()不能执行withHint查询,引发的性能问题
当需要击中索引时,应该使用以下的语句进行解决

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”); 还能生效吗?再看看源码:

Spring Mongo Temple Count()不能执行withHint查询,引发的性能问题
在使用find()的时候,会检查withHint方法,所以默认的count方法不会击中你定义的最佳索引,但是find方法不会击中你定义的最佳索引,记住了吗?
Spring Mongo Temple Count()不能执行withHint查询,引发的性能问题