Open wangming1993 opened 8 years ago
{ "item": 1, "location": 1, "stock": 1 }
支持:
{ item: 1 } { item: 1, location: 1 }
db.events.createIndex( { "username" : 1, "date" : -1 } )
支持sort:
db.events.find().sort( { username: -1, date: 1 } ) db.events.find().sort( { username: 1, date: -1 } )
不支持:
db.events.find().sort( { username: 1, date: 1 } )
MongoDB 版本
~ » mongo --version MongoDB shell version: 3.0.8
创建订单表, 插入10000条数据
~ » mongo for(var i = 0; i < 10000; i++) { db.order.insert({"sku": i+1, "cid": 10000 - i}); }
根据_sku_查询, 使用_explain()_进行分析
db.order.find({"sku":100}).explain()
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.order", "indexFilterSet" : false, "parsedQuery" : { "sku" : { "$eq" : 100 } }, "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "sku" : { "$eq" : 100 } }, "direction" : "forward" }, "rejectedPlans" : [ ] }, "ok" : 1 }
观察到 winningPlan 的 stage 为 _COLLSCAN_ 为 _全表扫描_
添加索引
db.order.ensureIndex({"sku":1})
再次根据_sku_查询
> db.order.find({"sku":100}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.order", "indexFilterSet" : false, "parsedQuery" : { "sku" : { "$eq" : 100 } }, "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "sku" : 1 }, "indexName" : "sku_1", "isMultiKey" : false, "direction" : "forward", "indexBounds" : { "sku" : [ "[100.0, 100.0]" ] } } }, "rejectedPlans" : [ ] } }
发现现在 stage 为 _IXSCAN_, 意为 index scan, 索引扫描, 此时利用了索引
创建collection, 添加数据
for(var i = 0; i < 10000; i++) { db.order_2.insert({"sku":i+1, "cid":9999-i}); }
添加复合索引 _sku_1_cid1
db.order_2.ensureIndex({"sku":1, "cid":1});
观察现象
4个字段组成的复合索引支持的查询类型
for(var i = 0; i < 10000; i++) { db.order_4.insert({"sku":i+1, "cid":9999-i, "status": i * 100, "order" : i}); }
db.order_4.ensureIndex({"sku":1,"cid":1,"status":1,"order":1})
综上所述:
MongoDB Indexes
支持:
支持sort:
不支持:
实验
单个索引
观察到 winningPlan 的 stage 为 _COLLSCAN_ 为 _全表扫描_
发现现在 stage 为 _IXSCAN_, 意为 index scan, 索引扫描, 此时利用了索引
复合索引
综上所述: