索引
MongoDB支持索引。如果没有建立索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的那些文档。 如果查询存在适当的索引,则MongoDB可以使用该索引来限制它必须检查的文档数。
建立索引通常能够极大的提高查询的效率,索引主要用于排序和检索。索引是特殊的数据结构,它以易于遍历的形式存储收藏集数据集的一小部分。 索引存储一个特定字段或一组字段的值,按该字段的值排序。 索引条目的排序支持有效的相等匹配和基于范围的查询操作。 另外,MongoDB可以通过使用索引中的顺序来返回排序的结果。
怎么创建索引
要在Mongo Shell中创建索引,使用db.collection.createIndex()。
db.collection.createIndex( , )
key and index type specification:索引的Key值和规范配置
Key值为要创建的索引字段,1为指定按升序创建索引,-1为降序,也可以指定为hashed(哈希索引)
options:索引属性等相关的配置。
例如:
db.collection.createIndex( { name: -1 } )
在本地测试库创建一个索引
查看创建的索引
可以看出MongoDB默认在_id上创建一个索引(唯一索引), _id索引可防止客户端为_id字段插入两个具有相同值的文档。name:-1,索引的名称会按照这个规则生成,索引创建的key + 下划线"_" + -1。
数值1还起到了排序的作用。值1指定一个索引,该索引按升序对项目进行排序。 值-1指定一个索引,该索引按降序对项目进行排序。
例如本例中的索引名称为name_-1。你也可以自己设置索引的名称。
一旦创建索引,将无法重命名。所以,必须删除并使用新名称重新创建索引。
索引的类型
单键索引
在某一个特定的属性上建立索引,例如:db.users.createIndex({score:-1});
复合索引
在多个特定的属性上建立索引,例如:db.users. createIndex({username:1,age:-1,country:1});
复合索引中列出的字段顺序具有重要意义。例如,如果一个复合索引由{userid:1,score:-1}组成,则该索引首先按userid排序,然后在每个userid值内按score排序。
对于复合索引和排序操作,索引键的排序顺序(即升序或降序)可以确定索引是否可以支持排序操作。
在索引字段上进行精确匹配、排序以及范围查找都会使用此索引,但与索引的顺序有关。
为了性能考虑,应删除存在与第一个键相同的单键索引。
多键索引
MongoDB使用多键索引来索引存储在数组中的内容。 如果您对保存数组值的字段建立索引,则MongoDB将为数组的每个元素创建单独的索引条目。 这些多键索引允许查询通过匹配数组的一个或多个元素来选择包含数组的文档。 如果索引字段包含数组值,MongoDB会自动确定是否创建多键索引。 您无需显式指定多键类型。
哈希索引
不同于传统的B-树索引,哈希索引使用hash函数来创建索引。
例如:db.users.createIndex({username : 'hashed'});
在索引字段上进行精确匹配,但不支持范围查询,不支持多键hash。
Hash索引上的入口是均匀分布的,在分片集合中非常有用。
从4.0版开始,mongo shell提供了convertShardKeyToHashed()方法。 此方法使用与散列索引相同的散列函数,并可用于查看键的散列值是什么。
地理空间索引
为了支持对地理空间坐标数据的高效查询,MongoDB提供了两个特殊的索引:返回结果时使用平面几何的2d索引和使用球面几何返回结果的2dsphere索引。
具体可参看:https://docs.mongodb.com/manual/core/2d/
文本索引
MongoDB提供了一种文本索引类型,该类型支持在集合中搜索字符串内容。 这些文本索引不存储特定于语言的停用词(例如"the", "a","or"),并且在集合中词干仅存储根词。
索引属性
常见的索引属性如下:
索引管理方法
创建索引
单键唯一索引:db.users. createIndex({username :1},{unique:true});
单键唯一稀疏索引:db.users. createIndex({username :1},{unique:true,sparse:true});
复合唯一稀疏索引:db.users. createIndex({username:1,age:-1},{unique:true,sparse:true});
创建哈希索引并后台运行:db.users. createIndex({username :'hashed'},{background:true});
删除索引
根据索引名字删除某一个指定索引:db.users.dropIndex("username_1");
删除某集合上所有索引:db.users.dropIndexs();
删除重建某集合上所有索引:db.users.reIndex();
查询集合上所有索引:db.users.getIndexes();