首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么$nin比$in慢,Mongodb

为什么$nin比$in慢,Mongodb
EN

Stack Overflow用户
提问于 2020-09-29 15:25:38
回答 2查看 1.1K关注 0票数 2

我收集的文档有500万份,有正确的索引。$在工作中很完美,但是与$nin超级slow...What相同的查询原因是什么呢?

超快:

代码语言:javascript
复制
{'tech': {'$in': ['Wordpress', 'wordpress', 'WORDPRESS']}}

超慢..。

代码语言:javascript
复制
{'tech': {'$nin': ['Wordpress', 'wordpress', 'WORDPRESS']}}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-29 16:54:05

以下解释仅适用于3.2之前的Mongo版本

Mongo v3.2有各种存储引擎的改变,从而提高了这个问题的性能。

现在,$nin散列了一个重要的特性,即它不是选择性查询,首先让我们了解选择性的含义:

选择性是查询使用索引缩小结果的能力。有效的索引更有选择性,并允许MongoDB将索引用于与完成查询相关的工作的更大部分。

现在,他们甚至说出了自己的想法:

例如,不等式运算符$nin和$ne不是很有选择性,因为它们通常匹配索引的很大一部分。因此,在许多情况下,带有索引的$nin或$ne查询的性能可能不会优于必须扫描集合中所有文档的$nin或$ne查询。

当时的selectivity在性能上非常出色。这就引出了你的问题,为什么没有使用索引?

当蒙戈被要求创建一个查询计划时,他预先在所有可用的查询计划之间形成了一个“竞赛”,其中之一是COLSCAN I--即收集扫描,其中第一个找到101个文档的计划获胜。由于非选择性查询的效率很低,获胜计划(实际上根据查询中的索引和值更快)是COLSCAN,请进一步阅读此这里

票数 4
EN

Stack Overflow用户

发布于 2020-09-29 16:53:27

当您有一个索引时(无论您谈论的是MongoDB还是任何其他数据库),搜索某个值总是比搜索一个不存在的值更快。

数据库必须扫描整个索引,通常在查找“不在”或“不相等”时甚至不使用索引。使用explain()查看执行计划

一些数据库(例如Oracle)提供所谓的位图索引。它们的工作方式不同,通常IN操作与NOT IN操作一样快。但是,和往常一样,它们与B*Tree索引相比还有其他缺点。据我所知,Oracle数据库是唯一支持位图索引的主要RDBMS。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64122731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档