mongo索引
准备
假设有一数据库 user
[
{
"address": {
"city": "shanghai",
"state": "shanghai",
"pincode": "232321"
},
"age": 12,
"name": "jack",
"tags": ["music", "cricket", "blogs"]
}
]
索引基本操作
- 查看索引
- 删除索引
- 重建索引
- 创建索引的参数
查看索引
db.user.getIndexes()
删除索引
# 删除单个
db.user.dropIndex
# 删除全部
db.user.dropIndexes()
重建索引
db.user.reIndex()
索引类型
- 单键索引(Single Field)
- 普通单键索引
- 嵌套文档索引
- 唯一索引
- 复合索引(Compound Index)
- 多键值索引(数组索引) Multikey Index
- 过期索引
- 哈希索引
- 地理位置索引
- 文本索引
单键索引(Single Field)
# 普通单键索引
db.user.createIndex({"age":-1},{"name":"idx_age"})
# 唯一索引
db.user.createIndex({"age":-1},{"name":"idx_age","unique":true})
# 嵌套文档索引
db.user.createIndex({"address.city":-1},{"name":"idx_address_city"})
复合索引(Compound Index)
db.user.createIndex({"name":-1,"age":-1},{"name": "idx_cp_name_age"})
多键值索引(数组索引) Multikey Index
db.user.createIndex({"tags":-1},{"name":"idx_arr_tags"})
索引规则
-
**最期望看到的查询组合 **
- Fetch+IDHACK
- Fetch+ixscan
- Limit+(Fetch+ixscan)
- PROJECTION+ixscan
-
最不期望看到的查询组合
- COLLSCAN(全表扫)
- SORT(使用sort但是无index)
- COUNTSCAN**(不使用索引进行count)
-
最左前缀原则
索引执行优化器
几个重要参数
- queryPlanner:查询计划的选择器,首先进行查询分析,最终选择一个winningPlan,是explain返回的默认层面。
- executionStats:为执行统计层面,返回winningPlan的统计结果
- allPlansExecution:为返回所有执行计划的统计,包括rejectedPlan
db.user.find({"tags":"music"}).explain("executionStats")
Stage意义
COLLSCAN :全表扫描
IXSCAN:索引扫描
FETCH::根据索引去检索指定document
SHARD_MERGE:各个分片返回数据进行merge
SORT:表明在内存中进行了排序(与前期版本的scanAndOrder:true一致)
SORT_MERGE:表明在内存中进行了排序后再合并
LIMIT:使用limit限制返回数
SKIP:使用skip进行跳过
IDHACK:针对_id进行查询
SHARDING_FILTER:通过mongos对分片数据进行查询
COUNT:利用db.coll.count()之类进行count运算
COUNTSCAN:count不使用用Index进行count时的stage返回
COUNT_SCAN:count使用了Index进行count时的stage返回
SUBPLA:未使用到索引的$or查询的stage返回
TEXT:使用全文索引进行查询时候的stage返回
其他操作
# 慢sql
db.system.profile.find().pretty();
# 当前操作
db.currentOp()