MongoDB学习—MongoDB的索引
1.什么是索引
- 索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构
- 它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单
- 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引目标是提高数据库的查询效率,没有索引的话,查询会进行全表扫描(scan every document in a collection),数据量大时严重降低了查询效率
- 默认情况下Mongo在一个集合(collection)创建时,自动地对集合的_id创建了唯一索引。
2.单建索引
- MongoDB支持所有数据类型中的单个字段索引,并且可以在文档的任何字段上定义。
- 对于单个字段索引,索引键的排序顺序无关紧要,因为MongoDB可以在任一方向读取索引。
创建索引实例
:db.集合名.createIndex({"字段名":排序方式})
3.过期索引:特殊的单间索引 TTL ( Time To Live)
- TTL索引是MongoDB中一种特殊的索引, 可以支持文档在一定时间之后自动过期删除,目前TTL索引只能在单字段上建立,并且字段类型必须是日期类型。
创建索引实例
:db.集合名.createIndex({"日期字段":排序方式}, {expireAfterSeconds: 秒数})
4.复合索引:遵循最左侧原则
- 通常我们需要在多个字段的基础上搜索表/集合,这是非常频繁的。
- 如果是这种情况,我们可能会考虑在MongoDB中制作复合索引。
- 复合索引支持基于多个字段的索引,这扩展了索引的概念并将它们扩展到索引中的更大域。
- 制作复合索引时要注意的重要事项包括:字段顺序与索引方向。
实例
:db.集合名.createIndex( { "字段名1" : 排序方式, "字段名2" : 排序方式 } )
5.多键索引(Multikey indexes)
针对属性包含数组数据的情况,MongoDB支持针对数组中每一个element创建索引,Multikeyindexes支持strings,numbers和nested documents
6. 地理空间索引(Geospatial Index)
- 针对地理空间坐标数据创建索引。
- 2dsphere索引,用于存储和查找球面上的点
- 2d索引,用于存储和查找平面上的点
- 实例:
db.company.insert( { loc : { type: "Point", coordinates: [ 116.482451, 39.914176 ] }, name: "大望路地铁", category : "Parks" } ) db.company.ensureIndex( { loc : "2dsphere" } ) // 参数不是1或-1,为2dsphere 或者 2d。还可以建立组合索引。 db.company.find({ "loc" : { "$geoWithin" : { "$center":[[116.482451,39.914176],0.05] } } })
6.全文索引
- MongoDB提供了针对string内容的文本查询,Text Index支持任意属性值为string或string数组元素的索引查询。注意:一个集合仅支持最多一个Text Index,中文分词不理想 推荐ES。
db.集合.createIndex({"字段": "text"}) db.集合.find({"$text": {"$search": "coffee"}})
7.哈希索引 Hashed Index:只支持单字段的索引
- 针对属性的哈希值进行索引查询,当要使用Hashed index时,MongoDB能够自动的计算hash值,无需程序计算hash值。注:hash index仅支持等于查询,不支持范围查询。
db.集合.createIndex({"字段": "hashed"})
8.索引管理
- 创建索引并在后台运行
db.COLLECTION_NAME.createIndex({"字段":排序方式}, {background: true});
- 获取针对某个集合的索引
db.COLLECTION_NAME.getIndexes()
- 索引的大小
db.COLLECTION_NAME.totalIndexSize()
- 索引的重建
db.COLLECTION_NAME.reIndex()
- 索引的删除
db.COLLECTION_NAME.dropIndex("INDEX-NAME") db.COLLECTION_NAME.dropIndexes()