首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何排除和改进这个缓慢运行的查询?

如何排除和改进这个缓慢运行的查询?
EN

Stack Overflow用户
提问于 2013-10-30 15:19:07
回答 2查看 99关注 0票数 3

我希望微调一个字符串搜索查询,我正在使用的蒙戈。在Server世界中,我想相信我对索引是如何工作的以及如何构建适当的索引有了很好的理解。我试着和蒙戈打了一针,但是,我不相信我不会用正确的方式去做。

我收集的文件大约有430万份。文档结构如下所示:

代码语言:javascript
运行
复制
{
   "_id":{
      "$oid":"527027456239d1212c07a621"
   },
   "ReleaseId":2451,
   "Status":"Accepted",
   "Title":"Hard Rhythmic Motions",
   "Country":"US",
   "MasterId":"35976",
   "Images":[
      {
         "Type":"primary",
         "URI":"http://api.discogs.com/image/R-2451-1117047026.jpg",
         "URI150":"http://api.discogs.com/image/R-150-2451-1117047026.jpg",
         "Height":307,
         "Width":307
      },
      {
         "Type":"secondary",
         "URI":"http://api.discogs.com/image/R-2451-1117047033.jpg",
         "URI150":"http://api.discogs.com/image/R-150-2451-1117047033.jpg",
         "Height":307,
         "Width":307
      }
   ],
   "Artists":[
      {
         "_id":2894,
         "Name":"DJ Hyperactive"
      }
   ],
   "Formats":[
      {
         "Name":null,
         "Quantity":1
      }
   ],
   "Genres":[
      "Electronic"
   ],
   "Styles":[
      "Hardcore",
      "Acid"
   ]
}

我正在对一个顶级文档属性和一个嵌套文档属性执行不区分大小写的搜索:

代码语言:javascript
运行
复制
db.releases.find({$or: [{Title: new RegExp('.*mozart.*',"i")},{'Artists.Name': new RegExp('.*mozart.*',"i")}]})

我尝试创建一个索引;当我执行.getIndexes()时,我可以看到我创建的索引:

代码语言:javascript
运行
复制
{
    "v" : 1,
    "key" : {
            "Title" : 1,
            "Artists.Name" : 1
    },
    "ns" : "discogs.releases",
    "name" : "Title_1_Artists.Name_1"
}

在这一点上,我认为我将一切就绪。但是,查询的执行时间在28到32秒之间。我试着打电话给.explain()以获得更多的洞察力:

代码语言:javascript
运行
复制
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 4098,
    "nscannedObjects" : 4292400,
    "nscanned" : 4292400,
    "nscannedObjectsAllPlans" : 4292400,
    "nscannedAllPlans" : 4292400,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 29,
    "nChunkSkips" : 0,
    "millis" : 29958,
    "indexBounds" : {

    },
    "server" : "lambic:27017"
}

根据我对Mongo的有限知识,这看起来就像一个表扫描,这就是为什么查询不能很好地执行的原因。但是,我不知道如何使这个查询更好!我希望我创建的索引涵盖这个查询,但是,情况不一定是这样的。

现在,我要指出的最后一件事是,这肯定不是在最健壮的服务器上。硬件规格(包括CPU和RAM)非常有限。然而,如果我的分析是正确的,我正在做一个表格扫描,我必须有一些性能改进,我可以在蒙古方面。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-27 17:36:41

谢谢大家的回复。我想跟进这个问题,因为它有几票,并确保任何人在未来偶然发现这一页知道我做了什么。

全文索引听起来是一个很好的解决方案。但是,因为这只是我的一个小的附带项目,我不愿意把更多的硬件投入到这个体系结构中(全文索引需要为400万条记录提供大量的磁盘空间)。

我最后所做的是将数据结构扁平化,使它们更容易查询和删除通配符搜索,这样就可以实际使用该新结构上的索引。通过这样做,我可以实现一个indexOnly查询(尽管性能仍然不是很好,但考虑到我的硬件堆栈很弱,我发现它已经足够了)。

票数 0
EN

Stack Overflow用户

发布于 2013-11-15 08:28:41

完整的文本索引可能是您所需要的。您还可以在插入文档之前解析文档,并将关键字放在文档中的数组中,并对该数组进行索引。

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

https://stackoverflow.com/questions/19686766

复制
相关文章

相似问题

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