【问题标题】:MongoDB compound index usageMongoDB 复合索引的使用
【发布时间】:2013-07-18 22:46:17
【问题描述】:

假设我有以下两个键的文档:

1) 键1
2) key2

如果我在他们两个上创建复合索引..

{'key1':1,'key2':1}

在运行仅与 key1.. 相关的查询时,是否使用上面的索引?或者我还需要为 key1 创建特定索引?

谢谢

【问题讨论】:

标签: mongodb indexing compound-index


【解决方案1】:

在 MongoDB 中,您可以使用索引前缀来查询数据库。你不能使用其他任何东西。如果您的查询不包含键前缀,则不会使用 索引

假设您建议的索引{'key1':1,'key2':1}

将使用索引的查询:

  • db.some.find({key1 : {$gt : 100}}) - 使用前缀
  • db.some.find({key1 : {$gt : 100}, key2 : {$lt : 30}}) - 使用完整索引
  • db.some.find({key3 : 'test'}).sort({key1 : 1}) - 使用前缀进行排序(方向匹配)

不使用索引的查询:

  • db.some.find({key2 : {$gt : 100}}) - 索引顺序很重要 - key2 不是前缀
  • db.some.find({key3 : 'test'}).sort({key1 : -1}) - 索引方向对多列索引很重要
  • db.some.find({key3 : 'test'}).sort({key2 : 1}) - 不是前缀

【讨论】:

  • 这应该是公认的答案,因为它更准确地描述了 prefix usage 在 MongoDB 中的复合索引的行为。
【解决方案2】:

是的。在 B 树索引中,您可以使用列的前缀。

因此,您可以使用索引对“key1”进行查询(但对“key2”效率不高,索引中的列顺序很重要)。

这与印刷电话簿中的情况相同,它是 [lastName, firstName] 的索引。您可以使用它轻松地按姓氏查找人(而不是按名字那么容易,但仍然比打电话给每个人并询问他们的名字更有效)。

【讨论】:

  • 这不太正确。 (key1, key2) 上的索引不能仅用于查询 key2。 key1 需要出现在您的条件中。
  • @Derick:这可能是 MongoDB 的限制。例如,Oracle 可以进行索引快速全扫描。我说的是一般的 B 树(和电话簿)。无论如何,关键是您只能“合理地”使用 key1 的索引。
  • 这个问题是关于MongoDB的,所以你关于Oracle的观点在这里无效。
  • 我也没有对 Oracle 发表意见。我说的是一般的 B 树(和电话簿)。有时对这些事情有更深入的了解是有益的。无论如何,关键是您只能“合理地”使用 key1 的索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-19
  • 2012-03-24
  • 2013-08-25
  • 2016-07-10
  • 2018-01-22
  • 2016-09-06
  • 1970-01-01
相关资源
最近更新 更多