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:""
;
我测试了效果是一样的:
当然,如果业务场景是$nin:["foo","yutao"]
,像这样指定特定的字符就没办法啦!
使用$gt:""
,适合排除null和""
。
性能:其实使用$gt:""
后,并没有想象中的那么快,就我的业务而言,72万
的数据,查询获取总数时也需要2到4秒
,比使用$nin
好多啦,后者是直接请求超时。
不过我是沙盒环境,正式环境,有缓存,会好些。
参考地址:
https://docs.mongodb.com/manual/reference/operator/query/nin/