【问题标题】: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)

我想我有两个选择

  1. 索引并设置 shardKey on { age: 1, timestamp: -1 }

  2. 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-02
      • 2022-12-12
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 2018-05-24
      相关资源
      最近更新 更多