MongoDB复合索引用法

ass*_*z84 5 indexing mongodb compound-index

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

1)key1
2)key2

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

{'key1':1,'key2':1}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Tom*_*far 13

在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}) - 它不是前缀

  • 这应该是公认的答案,因为它更准确地描述了[前缀用法](http://docs.mongodb.org/manual/core/index-compound/#compound-index-prefix)对于复合索引的行为. MongoDB的. (2认同)

Thi*_*ilo 2

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

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

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

  • 这不太正确。(key1, key2) 上的索引不能用于仅查询 key2。key1 需要出现在您的标准中。 (3认同)
  • 这个问题是关于 MongoDB 的,所以你关于 Oracle 的观点在这里无效。 (2认同)