首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongo DB:优化基于唯一嵌入式键的查询

Mongo DB:优化基于唯一嵌入式键的查询
EN

Stack Overflow用户
提问于 2011-12-20 04:48:32
回答 2查看 188关注 0票数 1

我有一个Mongo集合,其中每个文档都有一组唯一的嵌入键:

代码语言:javascript
复制
{
    Facebook :
    {
        Archived:'False' //non unique
        'fan_count_December_19_2011':12345, //unique
        'unique_views_count_December_19_2011':12345, //unique
        'post_count_December_19_2011':12345, //unique
        ...
        ...
    }
}

我们使用以下查询来查找这些文档:

代码语言:javascript
复制
db.metrics.find({
    {'Facebook.fan_count_December_19_2011' : {'$ne':null}},'Archived':'False'}
}
).limit(1)

问题是,对于6000个这样的文档,它有点慢。查看Explain()日志;每个查询平均需要0.06秒来执行,并且每次都会执行一次完整的集合扫描。我们的服务必须进行大约100次以上的查询(对于100个不同的键);以0.06p/s的速度计算,每次调用总计6秒(不包括为数据提供服务的站点的开销)。在一次批处理中发送所有键并执行一个大型查询将需要对数据层进行重大重写;由于截止日期即将到来,我正在努力避免重写数据层。我一直在浏览文档,似乎没有一种方法可以建立基于键的索引。文档说您可以对嵌入的键进行索引;但这似乎只对值进行了索引。这对我也没有多大好处;因为系统中的每个键都是唯一的;每个新键都必须有一个索引。

除了重新设计我们的文档结构(这将需要重大的更改)之外,我还能做些什么来加快对现有集合的当前格式的查询呢?

任何建设性的意见都是非常感谢的。

谢谢,弗兰克

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-21 00:10:07

假设在处理完文档后将存档字段设置为true,则可以仅在存档字段上创建索引。

通常,您不会在基数较低的字段上创建索引,但在这种情况下,它可能适用于您,但前提是归档字段为false的文档不是很多。

从长远来看,您应该重新设计您的文档,这样您就不会有太多的唯一字段名(类似于Iain建议的"Facebook.date“字段)。这样你就有了可以创建索引的东西。

票数 2
EN

Stack Overflow用户

发布于 2011-12-20 08:21:42

这只是一个猜测,但我怀疑它正在进行范围扫描,因为其中之一:

  1. 您尚未在字段上指定索引,或者
  2. 您正在执行一个可能不使用索引的不相等筛选器...在Mongo文档上,它说“MongoDB的$ne或$nin操作符在索引方面效率不高。”

我建议你为字段‘Facebook.fan_count_12.12_19_2011’建立索引,并使用大于运算符。

代码语言:javascript
复制
db.metrics.find({
    {'Facebook.fan_count_December_19_2011' : {'$gte':1}},'Archived':'False'}
}
).limit(1)

当然,您将需要创建大量索引,但您可以在高级脚本中轻松地完成这项工作。

您还可以考虑将date存储为字段,然后您可以像下面这样:

代码语言:javascript
复制
db.metrics.find({
    {'Facebook.date' : {'$gte':'2011-12-01'}},'Archived':'False'}
}
).limit(100)

无论哪种方式,你都需要一个索引,这是不可避免的。

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

https://stackoverflow.com/questions/8567367

复制
相关文章

相似问题

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