【发布时间】:2015-08-18 01:18:30
【问题描述】:
我正在尝试重现索引交集指令的第一个示例 (http://docs.mongodb.org/manual/core/index-intersection/),但遇到一个问题:mongo 不使用两个索引
我的步骤:
- 下载 mongo (3.0.3) 并安装
- 运行 mongod:mongod.exe --dbpath d:\data(文件夹为空)
- 运行 mongo:mongo.exe
-
添加索引:
db.orders.ensureIndex({ qty: 1 }) db.orders.ensureIndex({ item: 1 }) db.orders.getIndexes() [{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.orders" }, { "v" : 1, "key" : { "qty" : 1 }, "name" : "qty_1", "ns" : "test.orders" }, { "v" : 1, "key" : { "item" : 1 }, "name" : "item_1", "ns" : "test.orders" }] -
查询查询说明:
db.orders.find( { item: "abc123", qty: { $gt: 15 } } ).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.orders", "indexFilterSet" : false, "parsedQuery" : { "$and" : [ { "item" : { "$eq" : "abc123" } }, { "qty" : { "$gt" : 15 } } ] }, "winningPlan" : { "stage" : "KEEP_MUTATIONS", "inputStage" : { "stage" : "FETCH", "filter" : { "qty" : { "$gt" : 15 } }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "item" : 1 }, "indexName" : "item_1", "isMultiKey" : false, "direction" : "forward", "indexBounds" : { "item" : [ "[\"abc123\", \"abc123\"]" ] } } } }, "rejectedPlans" : [ { "stage" : "KEEP_MUTATIONS", "inputStage" : { "stage" : "FETCH", "filter" : { "item" : { "$eq" : "abc123" } }, "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "qty" : 1 }, "indexName" : "qty_1", "isMultiKey" : false, "direction" : "forward", "indexBounds" : { "qty" : [ "(15.0, 1.#INF]" ] } } } } ] }, "serverInfo" : { "host" : "localhost", "port" : 27017, "version" : "3.0.3", "gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105" }, "ok" : 1 }
如您所见,winningPlan 仅包含 item_1 索引。有包含 qty_1 索引的拒绝计划。但是没有包含索引交集的计划。 我知道选择特定索引有很多条件。但就我而言,mongo 甚至没有计划!
有人可以帮我吗?
【问题讨论】:
-
FWIW,与 MongoDB 3.0.2 相同
-
数据库中有多少文档?
explain(true)说什么?查询需要多长时间?数据字段的分布情况如何?
标签: mongodb indexing database-indexes mongodb-indexes