At": 1 }, { expireAfterSeconds: 3600 } )
索引结构和特性:
(1) B树结构,顺序存储:MongoDB的索引均采用B树的结构组织,支持高效的等值查询和范围查询。且内部索引项(entry)是默认有序的,可以天然保证返回结果有序。
(2) 索引的排序:构建索引是可以指定索引项是按照升序或降序构建,升序或降序的选择对于单值索引来说是等效的,但是对于组合索引则不等学效,组合索引被组织成上下级的树形结构,升序或降序选择错误,会对性能产生较大影响。
(3) 索引的交集:2.6版本以后,索引的查询优化策略支持索引的交集,可以将多条索引组合来使用,最高效的检索数据。例如可以构建两条单独的索引,当查询条件关联到这两条索引的时候,索引优化计划会自动组合这两条索引来检索。
例如构建了如下2条索引:
{ qty: 1 }
{ item: 1 }
则以下查询语句会命中以上两条索引:
db.orders.find( { item: "abc123", qty: { $gt: 15 } } )
另外索引的交集和包括:
索引的前缀交集:主要针对组合索引,查询计划会优化组合索引的前缀来查询。
索引分析方法:
(1) 评估RAM容量,尽量保证索引在内存中:
查询索引大小的命令(单位是字节):
db.collection.totalIndexSize()
db.collection.stats()
(2) 分析查看索引的计划:
MongoDB中使用explain和hint可以查看索引的策略:
db.collection.find().explain()
可以看出那条索引策略生效,以及索引交集的使用情况。
db.collection.find().hint({"name":1})
hint的命令则可以指定强制使用某条索引。
(3) 索引的管理信息: 每个DB下面都会有一个system.indexes集合,这个集合记录着DB下,索引构建的元数据信息。
db.system.indexes.find()
注意点:
(1) 每个索引需要至少8K的空间。
(2) MongoDB 会对 _id字段自动创建唯一索引。
(3) 一个特别的索引类型支撑了TTL集合的实现,TTL依赖一个在Mongod中的后台线程,该线程读取索引中日期类型的值并从集合中删除过期的documents。