用于范围查询的MongoDB索引和ShardKey?

时间:2013-09-29 16:52:10

标签: mongodb indexing schema sharding

我将使用MongoDB 2.4.x

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

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

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

我的查询如下

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

我想我有两个选择

  1. 索引并在{age:1,timestamp:-1}

  2. 上设置 shardKey
  3. shardKey 使用基于哈希的索引,为查询使用上述索引 >缓存最近的查询结果在内存中(memcached或redis),因为范围查询将会击中许多分片服务器。

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

1 个答案:

答案 0 :(得分:0)

缓存是否有意义取决于范围查询的差异,返回的数据量以及缓存需要无效的频率。

添加Redis或Memcached等其他数据库技术会给项目增加额外的技术复杂性。这将需要更多的技术诀窍和工时来维护产品,这将产生另一个失败点。因此,当可以以适当的方式进行时,您应该尝试在MongoDB中进行缓存。

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

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

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

你的索引是这样的:

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

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