我将使用MongoDB 2.4.x
这意味着我可以使用基于哈希的索引。
我可以将索引设置为 shardKey ,它将几乎均匀地分布在服务器中,并且可以均匀访问。
当我尝试执行范围查询时会出现问题。
我的查询如下
db.feeds.find({ age: { $gte: 20, $lte: 25}}).sort({timestamp: -1}).limit(10)
我想我有两个选择
索引并在{age:1,timestamp:-1}
对 shardKey 使用基于哈希的索引,为查询使用上述索引 >缓存最近的查询结果在内存中(memcached或redis),因为范围查询将会击中许多分片服务器。
哪一种处理范围查询的策略是非常有效的? 或者关于这个问题的任何其他建议?
答案 0 :(得分:0)
缓存是否有意义取决于范围查询的差异,返回的数据量以及缓存需要无效的频率。
添加Redis或Memcached等其他数据库技术会给项目增加额外的技术复杂性。这将需要更多的技术诀窍和工时来维护产品,这将产生另一个失败点。因此,当可以以适当的方式进行时,您应该尝试在MongoDB中进行缓存。
您可以将缓存实现为MongoDB中的另一个(上限?)集合,其中散列的分片键包含用于结果的查询的范围分隔符。
此缓存集合中的文档将如下所示:
{
age_range: {
from: 20,
to: 25
},
results: [
...
]
}
你的索引是这样的:
ensureIndex( {
age_range:"hashed"
},
{
unique:1
}
);
请记住,当您拥有非常大的结果集时,这可能会出现问题,因为MongoDB中的最大文档大小限制为16MB。