mongodb系列~ 索引详解
一 索引分类
1 单列索引 2 联合索引 3 唯一索引 4 TTL索引(删除数据) 5 2dsphere 6 文本索引 7 hash索引
二 原则
1 一个集合最多支持64个索引,单个索引最大内存占用500M 控制参数maxIndexBuildMemoryUsageMegabytes 索引键值不能超过1024个字节,否则会触发报错
2 文本索引-1 只能最多有一个文本索引
2 db.collections.create!ndex( { comments :”text” })-针对comments字段添加文本索引
3 最左联合索引
4 支持覆盖索引
5 支持同时创建升序+降序组合索引 1 db.collections.createindex({"column1":1,"column2":-1})
6 TTL索引 -1 要注意列必须是日期或者包含日期的数组,否则不会删除,
2 本身是单列索引,不支持复合索引
3 列的本身不能是索引,否正需要删除后再进行添加
4 无法再capped集合上创建
5 db.collections.create Index ({”lastModifiedDate”: 1 } ,{ expireAfterSeconds: 3600 } )
7 唯一性索引- 1 针对缺失列和重复列检测是否能添加,针对hash索引无法指定唯一性约束
2 db .members . createindex( { groupNumber : 1 ,astname :1 , firstname : 1 },{unique: true } )
三 索引执行计划树
第一部分
1 COLLSCAN:全表扫描
2 SORT:排序
3 IXSCAN:索引扫描
4 SUBPLA:未使用到索引的$or查询的stage返回
第二部分
1 nReturned:实际返回的行数
2 totalKeysExamined:索引扫描的行数
3 totalDocsExamined:非索引扫描的行数
nReturned=totalKeysExamined & totalDocsExamined=0->我理解的是覆盖索引
nReturned=totalKeysExamined=totalDocsExamined
日志
1 keysExamined 索引扫描行数
2 docsExamined 文档扫描行数
3 ntreturned 实际返回的行数
4 reslen:返回的结果集大小,byte数
5 keyUpdates:该查询更新的索引键数目。
6numYields:该查询为其它查询让出锁的次数。
四 相关说明 skip
1 find().skip().limit() 来实现“翻页”功能 skip的作用是跳过N行,这里我们可知,类似mysql的limit,skip的值越大,cpu消耗越高,因为要跳过的行数太多
2 skip和limit操作在分片集群架构下是在mongos进行处理,并非mongod实例上,这点要注意先汇总再进行额外操作
3 cursor.s kip ()方法通常很 昂贵,因为它需要 务器从集合或索引的开始处遍历,以便在开始
返回结果之前获取偏移或跳过位置随着偏移量的增加 cursor.skip ()的运行将变得更慢 并且CPU 密集度更高 对于较大的集合,cursor.skip ()可能会成为 I/O 瓶颈.尽量不要使用skip,用别的方式代替
五 执行计划
默认 queryPlanner
扩展信息 executionStats:会返回最佳执行计划的一些统计信息 mongo日志展示的就是这个