【问题标题】:MongoDB Index and ShardKey for range queries?用于范围查询的 MongoDB 索引和 ShardKey?
【发布时间】:2013-09-30 16:33:52
【问题描述】:
我将使用 MongoDB 2.4.x
表示我可以使用Hashed-based索引。
我可以将索引设置为shardKey,它将几乎均匀地分布在服务器之间,并且将被均匀地访问。
当我尝试进行范围查询时出现问题。
我的查询如下所示
db.feeds.find({ age: { $gte: 20, $lte: 25}}).sort({timestamp: -1}).limit(10)
我想我有两个选择
索引并设置 shardKey on { age: 1, timestamp: -1 }
shardKey 使用 hashed-based 索引,query 和 使用 上述索引 >cache 最近的查询结果在内存中(memcached 或 redis),因为 范围查询 将访问许多分片服务器。
哪一种策略可以更有效地处理范围查询?
或者对这个问题有什么其他建议?
【问题讨论】:
标签:
mongodb
indexing
schema
sharding
【解决方案1】:
缓存是否有意义取决于您的范围查询的差异程度、它们返回的数据量以及缓存需要多久失效一次。
添加其他数据库技术(如 Redis 或 Memcached)会给您的项目增加额外的技术复杂性。维护产品需要更多的专业知识和工时,并且会造成另一个故障点。因此,当可以以适当的方式进行时,您应该尝试在 MongoDB 中进行缓存。
您可以将缓存实现为 MongoDB 中的另一个(封顶?)集合,其中散列的分片键由用于结果的查询的范围分隔符组成。
此缓存集合中的文档将如下所示:
{
age_range: {
from: 20,
to: 25
},
results: [
...
]
}
你的索引是这样的:
ensureIndex( {
age_range:"hashed"
},
{
unique:1
}
);
请记住,当您的结果集非常大时,这可能会出现问题,因为 MongoDB 中的最大文档大小限制为 16MB。