我有一个Mongo集合,其中每个文档都有一组唯一的嵌入键:
{
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
...
...
}
}我们使用以下查询来查找这些文档:
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秒(不包括为数据提供服务的站点的开销)。在一次批处理中发送所有键并执行一个大型查询将需要对数据层进行重大重写;由于截止日期即将到来,我正在努力避免重写数据层。我一直在浏览文档,似乎没有一种方法可以建立基于键的索引。文档说您可以对嵌入的键进行索引;但这似乎只对值进行了索引。这对我也没有多大好处;因为系统中的每个键都是唯一的;每个新键都必须有一个索引。
除了重新设计我们的文档结构(这将需要重大的更改)之外,我还能做些什么来加快对现有集合的当前格式的查询呢?
任何建设性的意见都是非常感谢的。
谢谢,弗兰克
发布于 2011-12-21 00:10:07
假设在处理完文档后将存档字段设置为true,则可以仅在存档字段上创建索引。
通常,您不会在基数较低的字段上创建索引,但在这种情况下,它可能适用于您,但前提是归档字段为false的文档不是很多。
从长远来看,您应该重新设计您的文档,这样您就不会有太多的唯一字段名(类似于Iain建议的"Facebook.date“字段)。这样你就有了可以创建索引的东西。
发布于 2011-12-20 08:21:42
这只是一个猜测,但我怀疑它正在进行范围扫描,因为其中之一:
我建议你为字段‘Facebook.fan_count_12.12_19_2011’建立索引,并使用大于运算符。
db.metrics.find({
{'Facebook.fan_count_December_19_2011' : {'$gte':1}},'Archived':'False'}
}
).limit(1)当然,您将需要创建大量索引,但您可以在高级脚本中轻松地完成这项工作。
您还可以考虑将date存储为字段,然后您可以像下面这样:
db.metrics.find({
{'Facebook.date' : {'$gte':'2011-12-01'}},'Archived':'False'}
}
).limit(100)无论哪种方式,你都需要一个索引,这是不可避免的。
https://stackoverflow.com/questions/8567367
复制相似问题