MongoDB排序查询的单一或复合索引?

时间:2019-05-18 12:15:56

标签: mongodb sorting indexing

我正在使用猫鼬,并且我有这样的查询:

const stories = await Story.find({ genre: 'romance' }).sort({ createdAt: -1 })

我想在Story上设置索引,以使这种查询变得更快。

其中一种是最好的方法,为什么:

1。使用两个字段创建一个复合索引:

Story.createIndex({genre: 1, createdAt: -1})

2。在每个字段上创建两个单独的索引:

Story.createIndex({genre: 1})
Story.createIndex({createdAt: -1})

2 个答案:

答案 0 :(得分:1)

只要您所有需要使用createdAt字段的查询,也要使用genre字段,就应该使用 compound index。

让我们比较两个选项:

查询:只要我上面说的两个查询都将表现为相同,那么在查询执行速度方面这两个查询就没有任何区别。< / p>

内存:复合索引将使用较少的内存,这在RAM空间有限的情况下至关重要。我们来看一个例子:

我们有3个文档:

{
 name: "john",
 last_name: "mayer"
}
{
 name: "john",
 last_name: "cake"
}
{
 name: "banana",
 last_name: "pie"
}

现在,如果我们在选项1上运行db.collection.stats(),则会得到复合索引:

totalIndexSize: 53248.0

与选项2相反:

totalIndexSize: 69632.0

插入:完全披露我不知道每种行为如何受到影响。从小型测试来看,复合索引似乎要快一些,但是我找不到真正的文档,也没有更深入地研究。

答案 1 :(得分:1)

如果“体裁”总是要成为搜索字段的一部分,那么使用复合索引将始终带来更好的性能。

1。)由要搜索的字段和对其进行排序的字段组成的复合索引可以满足这两个条件。

2。)创建多个索引假定,在执行查询时将使用两个索引,这是不正确的。索引交集概念仅在少数情况下适用。在这种特定情况下,由于我们在搜索条件中有一个字段,而在排序中则有另一个字段,因此Mongo将不会使用索引交集。 (Link)。

因此在这种情况下,我将使用复合索引。