索引可以加快速度读取,在写入、删除、更新的时候,会受到影响,因为在执行操作的时候,它们都会去读取索引,实际应用中有时候为了加快访问速度, 牺牲掉增删改的一点性能,还是有必要的,具体选择,根据实际使用业务场景,建立合适的索引。
// 添加索引
db.collection.createIndex({field: true})
// 未添加索引之前,会扫描整个集合, 显示COLLSCAN表示一组扫描,显示IXSCAN指示索引使用。
//explain() 查询分析器, 下面type未加索引
db.inventory.find({type:'food'}).explain();
结果如下:
db.inventory.find({type:'food'}).explain();
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "MyDB.inventory",
"indexFilterSet" : false,
"parsedQuery" : {
"type" : {
"$eq" : "food"
}
},
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"type" : {
"$eq" : "food"
}
},
"direction" : "forward"
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "DESKTOP-U0M7P28",
"port" : 27017,
"version" : "3.2.10",
"gitVersion" : "79d9b3ab5ce20f51c272b4411202710a082d0317"
},
"ok" : 1
}
给type字段创建一个索引
db.inventory.createIndex({ type: true })
// 在使用查询语句
db.inventory.find({ type : 'food'}).explain()
// 分析结果
db.inventory.find({ type : 'food'}).explain();
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "MyDB.inventory",
"indexFilterSet" : false,
"parsedQuery" : {
"type" : {
"$eq" : "food"
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"type" : true
},
"indexName" : "type_true",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"type" : [
"[\"food\", \"food\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"serverInfo" : {
"host" : "DESKTOP-U0M7P28",
"port" : 27017,
"version" : "3.2.10",
"gitVersion" : "79d9b3ab5ce20f51c272b4411202710a082d0317"
},
"ok" : 1
}