MongoDB索引
- MongoDB索引注意事项:
-
如果索引的大小超过了运行内存的限制,MongoDB会删除一些索引,这将导致性能下降。
-
MongoDB的索引在部分查询条件下是不会生效的。
-
正则表达式及非操作符,如
$nin,$not, 等。 -
算术运算符,如 $mod, 等。
-
$where自定义查询函数。
-
...
-
-
索引会在写入数据(添加、更新和删除)时重排,如果项目如果是写多读少,则建议少使用或者不要使用索引。
-
一个集合中索引数量不能超过64个。
-
索引名的长度不能超过128个字符。
-
一个复合索引最多可以有31个字段。
-
mongodb索引统一在
system.indexes集合中管理。这个集合只能通过createIndex和dropIndexes
// 获取当前集合中已经创建的所有索引信息 db.集合.getIndexes() /* [{ "v" : 2, // 索引版本 "key" : { // 索引的字段及排序方向(1表示升序,-1表示降序) "_id" : 1 // 根据_id字段升序索引 }, "name" : "_id" // 索引的名称 }] */ // 获取当前集合中已经创建的索引总大小,以字节为单位返回结果 db.集合.totalIndexSize() // 获取当前数据库中所有的索引【不会显示_id主键】 db.system.indexes.find()
查询分析
与SQL语句类似,MongoDB也提供了一个explain,供开发者进行查询分析。
db.orders.find({"title":"购买商品-19"}).explain("executionStats")
/*
{
"queryPlanner" : { # 被查询优化器选择出来的查询计划
"plannerVersion" : 1, # 查询计划版本
"namespace" : "test.orders", # 要查询的集合
"indexFilterSet" : false, # 是否了使用索引
"parsedQuery" : { # 查询条件
"title" : {
"$eq" : "购买商品-19"
}
},
"winningPlan" : { # 最佳执行计划
"stage" : "COLLSCAN", # 扫描类型/扫描阶段
"filter" : { # 过滤条件
"title" : {
"$eq" : "购买商品-19"
}
},
"direction" : "forward" # 查询方向,forward为升序,backward表示倒序。
},
"rejectedPlans" : [ ] # 拒绝的执行计划
},
"executionStats" : { # 最佳执行计划的一些统计信息
"executionSuccess" : true, # 是否执行成功
"nReturned" : 1, # 返回的结果数
"executionTimeMillis" : 346, # 执行耗时
"totalKeysExamined" : 0, # 索引扫描次数
"totalDocsExamined" : 1000000, # 文档扫描次数,所谓的优化无非是让totalDocsExamined和nReturned的值接近。
"executionStages" : { # 执行状态
"stage" : "COLLSCAN", # 扫描方式/扫描阶段
"filter" : {
"title" : {
"$eq" : "购买商品-19"
}
},
"nReturned" : 1, # 返回的结果数
"executionTimeMillisEstimate" : 5, # 预估耗时
"works" : 1000002, # 工作单元数
"advanced" : 1, # 优先返回的结果数
"needTime" : 1000000,
"needYield" : 0,
"saveState" : 1000,
"restoreState" : 1000,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 1000000 # 文档检查数目,与totalDocsExamined一致
}
},
"serverInfo" : { # 服务器信息
"host" : "ubuntu",
"port" : 27017,
"version" : "4.4.2",
"gitVersion" : "15e73dc5738d2278b688f8929aee605fe4279b0e"
},
"ok" : 1
}
*/
stage的扫描类型:
| 类型名称 | 描述 | 期望 |
|---|---|---|
| COLLSCAN | 全表扫描 | False |
| IXSCAN | 索引扫描 | True |
| FETCH | 根据索引去检索指定document | True |
| IDHACK | 针对_id进行查询 | True |
| COUNTSCAN | count不使用Index进行count时返回 | False |
| COUNT_SCAN | count使用了Index进行count时返回 | True |
| SUBPLA | 未使用到索引的$or查询时返回 | False |
| TEXT | 使用全文索引进行查询时返回 | - |
| SORT | 使用sort排序但是无index时返回 | False |
| SKIP | 使用skip跳过但是无index时返回 | False |
| PROJECTION | 使用limit限定结果但是无index时返回 | False |
创建索引
MongoDB支持多种类型的索引,包括普通索引、复合索引、多列索引、全文索引、

浙公网安备 33010602011771号