3

我将使用 MongoDB 2.4.x

这意味着我可以使用基于哈希的索引。

我可以将索引设置为shardKey,它将几乎均匀地分布在服务器之间,并且将被均匀地访问。

当我尝试进行范围查询时会出现问题。

我的查询如下

 db.feeds.find({ age: { $gte: 20, $lte: 25}}).sort({timestamp: -1}).limit(10)

我想我有两个选择

  1. 索引并在 { 年龄:1,时间戳:-1 } 上设置shardKey

  2. 对shardKey使用基于散列的索引,使用上述索引进行查询,并将最近的查询结果缓存在内存中(memcached 或 redis),因为范围查询会命中许多分片服务器。

哪一个是处理范围查询的有效策略?或者关于这个问题的任何其他建议?

4

1 回答 1

1

缓存是否有意义取决于您的范围查询有多么不同、它们返回多少数据以及缓存需要多久失效一次。

添加其他数据库技术(如 Redis 或 Memcached)会为您的项目增加额外的技术复杂性。维护产品需要更多的专业知识和工时,并且会造成另一个故障点。因此,当有可能以适当的方式进行时,您应该尝试在 MongoDB 中进行缓存。

您可以将缓存实现为 MongoDB 中的另一个(上限?)集合,其中散列分片键由用于结果的查询的范围分隔符组成。

此缓存集合中的文档将如下所示:

 { 
     age_range: {
         from: 20,
         to: 25
     },
     results: [
         ...
     ]
 }

你的索引是这样的:

ensureIndex( {
         age_range:"hashed"
     },
     {
         unique:1
     }
);

请记住,当您有非常大的结果集时,这可能会出现问题,因为 MongoDB 中的最大文档大小限制为 16MB。

于 2013-09-30T08:27:47.587 回答