Couchdb、Mango 查询和索引
Couchdb, Mango queries and Indexes
当用户想要搜索数据库时,我使用 Mango 查询和 Couchdb。他们可以通过文档中的多个字段进行搜索。
为简化起见,我有一个包含三个字段的文档,可以搜索所有字段以找到该文档。
FieldOne: cow
FieldTwo: pig
FieldThree: dog
在为查询创建芒果索引时,我应该使用哪些字段?我应该用多个字段创建和索引吗?顺序重要吗?
字段中还定义了三种不同的文档类型(A、B C)。我只需要搜索一个,是否可以从索引中排除其他类型以使其更快?
Field_Type: A
如果能够 运行 对视图建立索引以仅搜索我感兴趣的文档,这对我来说很有意义。这可能吗?
示例索引
已知出现在查询中的字段的一个索引
{
"index": {
"fields": [
"FieldOne"
]
},
"name": "foo-json-index",
"type": "json"
}
多个索引,不确定是否使用?
{
"index": {
"fields": [
"FieldOne",
"FieldTwo",
"FieldThree"
]
},
"name": "foo-json-index",
"type": "json"
}
或在构建查询时选择正确的多个索引?
获得最快搜索结果的正确方法是什么?
我认为在一般情况下您无法轻松解决此问题 - 您需要一个特定的选择器(或一组选择器)进行优化。但是,在创建可能有帮助的索引时需要考虑 3 个方面:
创建 Mango 索引时,只有包含所有索引字段的文档才会包含在索引中。您引用的第二个索引示例包含所有 3 个字段,只要您总是要在查询选择器中指定所有 3 个字段就完全没问题。
在查询时,只有根据选择器要求索引的所有索引字段都存在时,才能使用索引。例如,如果您的索引包含字段 A 和 B,但您只查询 A,则我们无法使用该索引,因为它不会包含包含 A 但不包含 B 的文档。
索引中字段的顺序很重要。索引只有在可以为索引字段找到连续范围的值时才能使用 - 与 _view 的复合键相同。例如,假设您在字段 A 和 B 以及文档 [{A:1,B:1},{A:1,B:2},{A:2,B:1},{A:2,B:2}]
上有一个索引。索引将类似于:[[1,1],[1,2],[2,1],[2,2]]
。如果您的查询是 A >= 1 AND B == 2
,则匹配文档([1,2]
和 [2,2]
)涵盖所有匹配文档的唯一范围是 [1,2],[2,1],[2,2]]
- 值 [2,1]
将需要在内存中过滤掉
您可以使用 _explain
端点查看使用什么索引来完成查询,这应该会给您一些线索,让您了解索引对于给定选择器的选择性如何。
当用户想要搜索数据库时,我使用 Mango 查询和 Couchdb。他们可以通过文档中的多个字段进行搜索。
为简化起见,我有一个包含三个字段的文档,可以搜索所有字段以找到该文档。
FieldOne: cow
FieldTwo: pig
FieldThree: dog
在为查询创建芒果索引时,我应该使用哪些字段?我应该用多个字段创建和索引吗?顺序重要吗?
字段中还定义了三种不同的文档类型(A、B C)。我只需要搜索一个,是否可以从索引中排除其他类型以使其更快?
Field_Type: A
如果能够 运行 对视图建立索引以仅搜索我感兴趣的文档,这对我来说很有意义。这可能吗?
示例索引
已知出现在查询中的字段的一个索引
{
"index": {
"fields": [
"FieldOne"
]
},
"name": "foo-json-index",
"type": "json"
}
多个索引,不确定是否使用?
{
"index": {
"fields": [
"FieldOne",
"FieldTwo",
"FieldThree"
]
},
"name": "foo-json-index",
"type": "json"
}
或在构建查询时选择正确的多个索引?
获得最快搜索结果的正确方法是什么?
我认为在一般情况下您无法轻松解决此问题 - 您需要一个特定的选择器(或一组选择器)进行优化。但是,在创建可能有帮助的索引时需要考虑 3 个方面:
创建 Mango 索引时,只有包含所有索引字段的文档才会包含在索引中。您引用的第二个索引示例包含所有 3 个字段,只要您总是要在查询选择器中指定所有 3 个字段就完全没问题。
在查询时,只有根据选择器要求索引的所有索引字段都存在时,才能使用索引。例如,如果您的索引包含字段 A 和 B,但您只查询 A,则我们无法使用该索引,因为它不会包含包含 A 但不包含 B 的文档。
索引中字段的顺序很重要。索引只有在可以为索引字段找到连续范围的值时才能使用 - 与 _view 的复合键相同。例如,假设您在字段 A 和 B 以及文档
[{A:1,B:1},{A:1,B:2},{A:2,B:1},{A:2,B:2}]
上有一个索引。索引将类似于:[[1,1],[1,2],[2,1],[2,2]]
。如果您的查询是A >= 1 AND B == 2
,则匹配文档([1,2]
和[2,2]
)涵盖所有匹配文档的唯一范围是[1,2],[2,1],[2,2]]
- 值[2,1]
将需要在内存中过滤掉
您可以使用 _explain
端点查看使用什么索引来完成查询,这应该会给您一些线索,让您了解索引对于给定选择器的选择性如何。