mongodb: 如何为不同的命令和查询使用索引?
mongodb: How to use an index for distinct command and query?
我在使用查询的非常慢的不同命令方面遇到了一些问题。
据我观察,如果您未指定查询,distinct 命令仅使用索引:
我在我的 MongoDB 3.0.10 服务器上创建了一个带有 1Mio 对象的测试数据库。每个对象如下所示:
{
"_id" : ObjectId("56e7fb5303858265f53c0ea1"),
"field1" : "field1_6",
"field2" : "field2_10",
"field3" : "field3_29",
"field4" : "field4_64"
}
字段值末尾的数字是随机的 0-99。
在集合上创建了两个简单索引和一个复合索引:
{ "field1" : 1 } # simple index on "field1"
{ "field2" : 1 } # simple index on "field2"
{ # compound index on all fields
"field2" : 1,
"field1" : 1,
"field3" : 1,
"field4" : 1
}
现在我对该数据库执行不同的查询:
db.runCommand({ distinct: 'dbtest',key:'field1'})
结果包含 100 个值,nscanned=100 并且在 "field1".
上使用了索引
现在相同的不同查询被查询限制:
db.runCommand({ distinct: 'dbtest',key:'field1',query:{field2:"field2_10"}})
它再次包含 100 个值,但是 nscanned=9991 并且使用的索引是所有字段中的第三个。
现在删除了上次查询中使用的第三个索引。再次执行最后一个查询:
db.runCommand({ distinct: 'dbtest',key:'field1',query:{field2:"field2_10"}})
它再次包含 100 个值,nscanned=9991 并且使用的索引是 "field2" 一个。
结论:如果我在没有查询的情况下执行不同的命令,结果将直接从索引中获取。但是,当我将不同的命令与查询结合使用时,只有查询使用索引,在这种情况下,不同的命令本身不使用索引。
我的问题是我需要在非常大的数据库上执行不同的查询命令。结果集非常大,但只包含约 100 个不同的值。因此,完整的不同命令需要很长时间(> 5 分钟),因为它必须循环遍历所有值。
需要做什么才能执行我上面给出的可以由数据库直接从索引回答的不同命令?
如果您的 Mongo 数据库版本支持,索引会自动用于不同的查询。
在不同查询中使用索引的可能性需要 Mongo 版本 3.4 或更高版本 - 它适用于两种存储引擎 MMAPv1/WiredTiger。
我在使用查询的非常慢的不同命令方面遇到了一些问题。 据我观察,如果您未指定查询,distinct 命令仅使用索引:
我在我的 MongoDB 3.0.10 服务器上创建了一个带有 1Mio 对象的测试数据库。每个对象如下所示:
{
"_id" : ObjectId("56e7fb5303858265f53c0ea1"),
"field1" : "field1_6",
"field2" : "field2_10",
"field3" : "field3_29",
"field4" : "field4_64"
}
字段值末尾的数字是随机的 0-99。
在集合上创建了两个简单索引和一个复合索引:
{ "field1" : 1 } # simple index on "field1"
{ "field2" : 1 } # simple index on "field2"
{ # compound index on all fields
"field2" : 1,
"field1" : 1,
"field3" : 1,
"field4" : 1
}
现在我对该数据库执行不同的查询:
db.runCommand({ distinct: 'dbtest',key:'field1'})
结果包含 100 个值,nscanned=100 并且在 "field1".
上使用了索引现在相同的不同查询被查询限制:
db.runCommand({ distinct: 'dbtest',key:'field1',query:{field2:"field2_10"}})
它再次包含 100 个值,但是 nscanned=9991 并且使用的索引是所有字段中的第三个。
现在删除了上次查询中使用的第三个索引。再次执行最后一个查询:
db.runCommand({ distinct: 'dbtest',key:'field1',query:{field2:"field2_10"}})
它再次包含 100 个值,nscanned=9991 并且使用的索引是 "field2" 一个。
结论:如果我在没有查询的情况下执行不同的命令,结果将直接从索引中获取。但是,当我将不同的命令与查询结合使用时,只有查询使用索引,在这种情况下,不同的命令本身不使用索引。
我的问题是我需要在非常大的数据库上执行不同的查询命令。结果集非常大,但只包含约 100 个不同的值。因此,完整的不同命令需要很长时间(> 5 分钟),因为它必须循环遍历所有值。
需要做什么才能执行我上面给出的可以由数据库直接从索引回答的不同命令?
如果您的 Mongo 数据库版本支持,索引会自动用于不同的查询。
在不同查询中使用索引的可能性需要 Mongo 版本 3.4 或更高版本 - 它适用于两种存储引擎 MMAPv1/WiredTiger。