欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mongodb中$nin操作的优化

程序员文章站 2024-03-14 10:28:04
...

环境

mongodb:3.4
jdk:1.7

前言

====2018年2月5日=====start===
看完这个后,建议再看下这篇,因为讲的是一件事情
mongodb 创建局部索引【Partial Indexes】
====2018年2月5日=====end===

今天对一些项目调整包的结构,在沙盒测试时,发现有个接口很慢,查看接口后,发现,条件里面有这么个东东:

//内容为null的话,就不显示出来
urlQuery.append("ir_urlcontent", new BasicDBObject("$nin", new Object[]{null, ""}));

这句话的意思是排除掉ir_urlcontent为null和空串的。

而操作符$nin,根据官网的解释,其会匹配到大多数的索引。其结果就是,它还是需要全表查询。

官网解释:

The inequality operator $nin is not very selective since it often matches a large portion of the
index. 
As a result, in many cases, a $nin query with an index may perform no better than a $nin query
that must scan all documents in a collection

所以当条件里面有这个$nin操作时,性能肯定慢,怎么办呢?

$gt

就我的业务而言,是去掉null和"",可以这样写:

urlQuery.append("ir_urlcontent", new BasicDBObject("$gt", ""));

也就是使用$gt:""

我测试了效果是一样的:

mongodb中$nin操作的优化

当然,如果业务场景是$nin:["foo","yutao"],像这样指定特定的字符就没办法啦!

使用$gt:"",适合排除null和""

性能:其实使用$gt:""后,并没有想象中的那么快,就我的业务而言,72万的数据,查询获取总数时也需要2到4秒,比使用$nin好多啦,后者是直接请求超时。

mongodb中$nin操作的优化

不过我是沙盒环境,正式环境,有缓存,会好些。

参考地址:

https://docs.mongodb.com/manual/reference/operator/query/nin/