MongoDB是基于集合建立索引(Index),索引的作用类似与传统关系型数据库,目的是为了提高查询速度。如果没有建立索引,MongoDB在读取数据时必须扫描集合中的所有文档记录。这种全集合扫描效率是非常低的,尤其在处理大数据时,查询可能需要花费几十秒到几分钟的时间。当建立索引后,查询将扫描索引内容,而不会去扫描对应的集合。
但在建立索引的同时,是需要增加额外存储开销的;在已经建立索引的情况下,若新插入了集合文档记录,则会引起索引重排序,这个过程会影响查询速度。MongoDB的索引基于B-tree数据结果及对应算法形成。
默认情况下,在建立集合的同时,MongoDB数据库自动为集合_id
建立唯一索引,可以避免重复插入同一_id值的文档记录。
一、 单一字段(键)索引
db.collection_name.createIndex(
{
<key>:<n>}
)
说明:对一个集合文档的键建立索引,key为键名,n=1为升序,n=-1为降序。
对单一键建立索引
嵌套文档单字段索引
二、 字段值唯一索引
db.collection_name.createIndex(
{
<key>:<n>, <key>:<n>,...},
{
unique:true}
)
说明:对一个或多个字段建立唯一索引。key为键名,n=1为升序,n=-1为降序
字段值唯一索引
- name的值必须是唯一的,不能有重复值出现;否则,MongoDB将新插入的重复文档予以拒绝。
- 在集合的同一个键上不能重复建立单一索引;若已经建立了索引,再在同一个Key上建立索引,将给予出错提示。
多字段索引
默认查询结果为(价格升序,颜色降序)
先用createIndex命令建立price、color多建组合索引,然后用find()查找文档记录;对查找出来的文档记录结果用sort({price:1, color:-1})先用price升序排序,在price价格一样的情况下,再对price相同记录做color降序排序。
价格降序,颜色升序:
多字段唯一索引
注意:只要name和price组合起来的值保持唯一性即可。
三、文本索引
在集合里,为文本内容的文档建立文本索引。
db.collection_name.createIndex(
{
<key1>:"text", <key2>:"text", ...}
)
基本文本索引
指定权重文本索引
通配符文本索引
为指定集合中的所有字符串内容进行搜索提供通配索引,这在高度非结构化的文档里比较有用。
四、 哈希索引
用于支持对分片键(带哈希键值对的分片集合)的分片数据索引,主要用于分布式数据索引。
db.collection_name.createIndex(
{
key:"hashed"}
)
//key为含有哈希值的键
建立哈希索引
- hashed索引不支持多字段索引
- hashed会把浮点数的小数部分自动去掉,所以对浮点数字段进行索引时,需要注意该特殊情况。如"2.2"、"2.3"都会当做"2"进行索引排序处理
- hashed不支持唯一索引
五、 其它方法
db.collection.dropIndex(index)
:移除集合指定的索引功能。index参数为指定需要删除的集合索引名,可用getIndexes()函数获取集合的所有索引名称db.collection.dropIndexes()
:移除一个集合的所有索引功能db.collection.getIndexes()
:返回一个指定集合的现有索引描述信息的文档数组db.collection.reIndex()
:删除指定集合上所有索引,并重新构建所有现有索引。db.collection.totalIndexSize()
:提供指定集合索引大小的报告信息