mongodb - 如何使用 Mongodb 的 $nin、$in 等运算符提高查询性能

标签 mongodb tagging

我有一个相当大的数据集,包含超过 300 万个文档,这些文档的标签类似于 StackOverflow,每个问题都使用标签。我用于存储标签的架构如下:

{"id": 12345, "tags":["tag1", "tag2", "tag3"]}, {"id": 12346, "tags":["tag2", "tag3"]}

我在标签字段上创建了一个多键索引。当我使用 $in 或 $nin 运算符执行查询来查找标签的交集、并集时,在服务器类计算机上的性能约为 7 秒。我可以做些什么来提高查询搜索的速度吗?

编辑1:

这是按要求提供的解释计划。我观察到,在我重新启动服务器并且只运行 mongodb 服务器后,查询返回的速度要快得多。查询执行速度更快(< 50 毫秒)。我怀疑索引没有缓存在内存中,尽管我有足够的未使用的内存,并且我的索引(800MB)可以轻松放入内存中。

db.tagsCollection.find( { "tags" : { $in : ['tag1', 'tag2'], $nin : ['tag4', ' tag5', 'tag6', 'tag7'] } } ).explain(); { "cursor" : "BtreeCursor tags_1 multi", "nscanned" : 6145193, "nscannedObjects" : 6145192, "n" : 969386, "millis" : 19640, "nYields" : 0, "nChunkSkips" : 0, "isMultiKey" : true, "indexOnly" : false, "indexBounds" : { "tags" : [ [ "tag1", "tag1" ], [ "tag2", "tag2" ] ] } }

注意

最佳答案

这是我认为的优化(尽管您可能需要测试它)

  1. 不存储标签,而是存储一个小 key 来标识特定文档具有的所有标签。 假设 post#125 的标签是:PHP、MongoDb、数据库。

    a) 清理标签,例如将它们全部转换为小写字母等 然后按字母顺序对它们进行排序。 当前标签将是:database、mongodb、php

    b) 有一个单独的集合,用于存储整数到标签的映射:

    {“_id”:1,“t”:“mongodb”}

    { "_id": 2 , "t": "php"} 等存储您网站的所有可能的标签

    c) 要存储文档,请使用之前集合中的标签到编号映射来创建标签键。 所以当前的数据库,mongodb,php将变成类似1-12-2

    d)存储您的文档,如下所示:

    { "id": 12345 , "标签": [1,12,3] }

查询: 在索引字段上使用整数而不是字符串将大大减少索引大小,并且与字符串索引相比,查询速度也会更快。 不确定性能增益的多少,但与当前的实现进行比较仍然值得一试。

关于mongodb - 如何使用 Mongodb 的 $nin、$in 等运算符提高查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6053273/

相关文章:

mongodb - 使用 mongoimport 导入日期数据类型

database - 扩展 Web 应用程序和标记 - Digg、Del.icio.us、StackOverflow

mysql - 如果可能的话,至少找到一个相似的标签

mongodb - 如何在golang中使用$unwind?

mongodb - 访问数组中嵌入文档中的值

javascript - 无法使用 HTTP Put 更新 MongoDB 集合内的对象?

github - 如何在 Github 提交中添加标签?

mongodb - 使用 $lookup 运算符的多个连接条件

c# - 使用 ItextSharp C# 标记 PDF 的各个页面

git - 使用 Maven + Git 组织项目