MongoDB复合索引使用

5
假设我有一个包含以下两个键的文档:
1) key1
2) key2
如果我要在这两个键上创建复合索引...
{'key1':1,'key2':1}

当运行仅与key1相关的查询时,上述索引是否被使用?还是我需要创建仅针对key1的特定索引?
谢谢。

有用的链接:https://dev59.com/F2LVa4cB1Zd3GeqPsgos?rq=1 - Thilo
1
在文档中已经很好地介绍了:http://docs.mongodb.org/manual/tutorial/create-indexes-to-support-queries/#create-compound-indexes-to-support-several-different-queries - WiredPrairie
2个回答

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

2
这应该是被接受的答案,因为它更正确地描述了MongoDB中复合索引的前缀用法的行为。 - Stennie

2

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

因此,您可以使用索引查询“key1”(但对于“key2”,索引中的列顺序很重要,效率会受到影响)。

这与印刷电话簿相同,它是一个[lastName,firstName]索引。您可以轻松地通过lastName查找人(通过firstName不太容易,但仍比打电话问每个人的名字更有效)。


3
这不太正确。在 (key1, key2) 上创建的索引不能仅基于 key2 进行查询。你的查询条件中需要包含 key1。 - Derick
@Derick:这可能是MongoDB的限制。例如,Oracle可以进行索引快速全扫描。我说的是B树一般情况下(以及电话簿)。无论如何,重点是你只能“合理地”使用key1的索引。 - Thilo
2
这个问题是关于MongoDB的,所以你提到Oracle的观点在这里是无效的。 - Derick
1
我并没有在谈论Oracle。我是在讨论B树(以及电话簿)的一般情况。深入理解这些东西有时是有益的。无论如何,重点是你只能“合理地”使用key1的索引。 - Thilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接