【问题标题】:mongodb compound or individual indexesmongodb 复合或单个索引
【发布时间】:2013-08-30 09:28:55
【问题描述】:

我需要一些关于如何使用 mongodb 正确设置索引的建议。

假设我的数据收集是这样的:

玩家

 - age
 - scores
 - fouls
 - yellow cards
 - red cards
 - offsides

我的问题是我的潜在查询可以涵盖所有索引组合,例如:

Get players that age < 30 and yellow card > 3
Get players that age < 30 and yellow card > 3 and red_cards >6
Get players that age < 30 and red_cards card > 3 and scores > 2
Get players that scores < 30 and yellow card > 3 and fouls < 6 and red_cards >2
Get players that scores < 30 and yellow card > 3 and fouls < 6 and red_cards >2 and age > 25

在这种情况下,分配索引的最佳方法是什么?如果我的集合有 6 个字段,就像我的示例中一样,我需要 36 个索引吗? 还是每个索引有一个字段是更好的选择?

【问题讨论】:

  • 每个集合的索引不能超过 64 个。但是,建议保持低于该数字。如果您的数据插入率很高,那么保持较小的数字就更重要了。阅读此docs.mongodb.org/manual/applications/indexes

标签: mongodb performance indexing database


【解决方案1】:

这个问题的答案取决于你的集合大小、查询率、不同类型查询的分布(具有某些参数集的查询比其他查询具有更高的速率)等。

如果您的集合大小小于 100k(例如)个文档,您可以确信您的所有查询都会快速,即使它们不使用索引并一直进行顺序扫描。

另一方面,如果您每秒有 1000 个此类查询,它将无法按预期工作,在这种情况下,您必须使用 profiler(system.profile) 来确定不同类型的查询。当你得到这个分布时,很明显你应该创建哪些索引。

您的主要目标应该是减少您读取的数据量(索引+文档)以满足查询。

最后,您可以通过创建MongoDB ReplicaSet 来提高读取吞吐量。

【讨论】:

  • 感谢您的回答,文档大小一般不会超过 10k,但是我会有很多这样的文档(大约 8 亿),我们设计了一个高查询率的系统和高吞吐量。在这种情况下你会建议做什么?
  • @BmaorLO,如果 10К 是单个文档的大小,那么您应该在问题中提及这一点,因为这很重要。您的原始描述大约有 6 个字段,并且此类文档的大小约为 0.1K(不是 10K)。您能否更清楚地写出平均文档大小、文档总数、查询率、文档结构和典型查询。
  • 你是对的,我很抱歉从一开始就不清楚。在这个周末我做了更多的研究之后,数字将如下所示。该文档将类似于此处发布的原始问题。我将有 10 亿条这样的记录,每个文件将是 0.1K(而不是 10k 对此感到抱歉)。我需要支持尽可能多的快速读取。在这种情况下你会建议做什么?
  • @BmaorLO,很难查询 100Gb(0.1K*10^9) 的数据。在这种情况下,您拥有任何查询的索引。使用分析器确定您最需要哪些索引。对不起,没有具体的建议给你。您还应该尝试关系数据库,您可能会受益于部分索引。
  • 感谢@amezhenin,感谢您的时间和精力帮助我。现在是游戏时间:)
猜你喜欢
  • 2016-10-19
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
相关资源
最近更新 更多