0

对于类似于以下内容的文档,

{
     "translations": [
             {
                 "source": "hello",
                 "lang": "en",
                 "target": "some target"
             },
             {
                "source": "hey",
                "lang": "en",
                "target": "target string"
             }
     ]
}

我应该创建多键索引还是复合索引?我想要的是当这个集合在sourceor上发生查询langtarget,它必须快速返回结果。

4

2 回答 2

1

它必须快速返回结果。

这取决于多种因素。一是数据量。另一个是您拥有的资源,例如内存、分片、节点。

由于您需要从嵌套文档中一次查询多个字段,因此您可以使用复合索引。但我建议你试试下面的东西

  1. 多键索引 - 检查您的用例 - 通过解释查询确认 mongo 使用索引交集

  2. 复合键索引 - 确保复合键索引大部分时间用于您的用例

在这两种情况下都会很快。您还需要考虑写入。每次写入都会导致索引更新。

于 2020-08-13T15:44:31.797 回答
0

您将获得的任何答案都不会准确,因为您需要提供有关您的用例的更多信息。如:
你有多少文件?
每个文档中平均有多少个数组元素?
您的数据是静态的、只读的。还是有更新和删除?
您期望对集合最常见的查询是什么?
请注意,“源”和/或“目标”上的索引必须使用相同的“排序规则”。
确保选择性的查询:虽然“source”和“target”具有较高的基数,但“lang”相比之下自然会具有较低的基数(唯一值较少)。测试您的查询将如何受益于索引“lang”独立与源或目标的复合。
确保索引“db.collection.totalIndexSize()”的大小完全适合 RAM 以避免磁盘读取。

如果您对应用程序的信息很少,您可以使用或不使用(如果需要,使用提示,强制使用特定索引)单键或复合索引的各种组合来评估(解释,indexstat)性能。

于 2020-08-13T17:42:46.533 回答