5

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

1) 键 1
2) 键 2

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

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

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

谢谢

4

2 回答 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})- 这不是前缀
于 2013-12-07T12:42:01.837 回答
2

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

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

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

于 2013-07-18T22:48:42.433 回答