一、说明
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可能要花费几十秒甚至几分钟,这对网站的性能是非常致命的。索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
二、原理
从根本上说,MongoDB中的索引与其它数据库系统中的索引类似。MongoDB在集合层面上定义了索引,并支持对MongoDB集合中的任何字段或文档的子字段进行索引。
关于MongoDB的索引部分,其官网文档地址如下:
https://www.mongodb.com/docs/manual/indexes/
三、操作
3.1 创建索引
db.集合名称.createIndex(keys,options);
说明:语法中的key值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
例如对集合中文档数据的title和description字段创建索引,则可以执行下述命令:
db.集合名称.createIndex({"title":1,"description":-1})
createIndex()接收可选参数,可选参数列表如下:
例如在创建索引时,使用可选参数name设置索引的名称:
db.users.createIndex({age:1},{name:'age_index'});
3.2 查看索引
db.集合名称.getIndexes();
3.3 删除集合所有索引
db.集合名称.dropIndexes();
特别说明:集合中的_id字段的索引是不能被删除
3.4 删除集合指定索引
db.集合名称.dropIndex("索引名称");
3.5 查看集合索引大小
db.集合名称.totalIndexSize();
其返回值表示的是索引占用的磁盘空间大小,单位是字节。
四、复合索引
说明:一个索引的值是由多个key进行维护的索引称之为复合索引
db.users.createIndex({name:1,age:-1},{name:"name_age_index"});
注意:MongoDB中复合索引和传统关系型数据库一致都是最左前缀原则。
MongoDB不管查询条件中的字段顺序是先age后name,还是先name后age,都是会走索引,和MySQL一样会对查询条件中的字段进行动态排序调整。
另外数据在进行排序时也是可以使用到索引,相关示例如下所示: