mongodb中$nin操作的优化教程
程序员文章站
2022-07-05 23:31:23
环境
mongodb:3.4
jdk:1.7
前言
今天对一些项目调整包的结构,在沙盒测试时,发现有个接口很慢,查看接口后,发现,条件里面有这么个东东:
//内容为null的话,...
环境
mongodb:3.4
jdk:1.7
前言
今天对一些项目调整包的结构,在沙盒测试时,发现有个接口很慢,查看接口后,发现,条件里面有这么个东东:
//内容为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好多啦,后者是直接请求超时。
不过我是沙盒环境,正式环境,有缓存,会好些。