mongodb中$nin操作的优化

41 篇文章 1 订阅

环境

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/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值