魏长东

weichangdong

东邪

mongodb索引

索引是用来加快查询速度的,事物都有双面性的,同时在每次插入、更新和删除操作时都会产生额外的开销。索引有时并不能解决查询慢的问题,一般来说,返回集合中一半以上的结果,全表扫描要比查询索引更高效些。
创建太多索引,会导致插入非常慢,同时还会占用很大空间。可以通过explain和hint工具来分析。
索引有方向的,倒序还是升序。
每个集合默认的最大索引个数为64个。

1. 查看索引

> db.ttlsa_events.getIndexes();
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "ttlsa_login.ttlsa_events",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "stmp" : -1
                },
                "ns" : "ttlsa_login.ttlsa_events",
                "name" : "stmp_-1"
        },
        {
                "v" : 1,
                "key" : {
                        "uid" : 1,
                        "stmp" : -1
                },
                "ns" : "ttlsa_login.ttlsa_events",
                "name" : "uid_1_stmp_-1"
        }
]

此实例中有三个索引,其中_id是创建表的时候自动创建的索引,不能删除。uid_1_stmp_-1是组合索引。1表示升序,-1表示降序。

2. 创建索引
索引参数有:

option          values              default
backgroud       true/false          false
dropDups        true/false          false
unique          true/false          false
sparse          true/false          false
> db.ttlsa_posts.ensureIndex({pid:1});

当有大量数据时,创建索引会非常耗时,可以指定到后台执行,只需指定“backgroud:true”即可。如

> db.ttlsa_posts.ensureIndex({pid:1},{backgroud:true});

3. 嵌入式索引
为内嵌文档的键创建索引与普通的键创建索引并无差异。

> db.ttlsa_posts.ensureIndex({"post.date":1})

4. 文档式索引

> db.ttlsa_comments.insert({cid:222, properties:{user:'ttlsa', email:'ttlsa@ttlsa.com'}})
> db.ttlsa_comments.ensureIndex({properties:1})

5. 组合索引

db.ttlsa_comments.ensureIndex({"properties.user":1,"properties.email":1})

对多个值进行组合索引,查询时,子查询与索引前缀匹配时,才可以使用该组合索引。

6. 唯一索引
只需要在ensureIndex命名中指定"unique:true"即可。

db.ttlsa_posts.ensureIndex({pid:1},{unique:true})

当为已有的集合创建索引,可能有些数据已经有重复了的,那么创建唯一索引将失败。可以使用dropDups来保留第一个文档,而后的重复文档将删除,这种方法慎重操作。

 db.ttlsa_posts.ensureIndex({pid:1},{unique:true, dropDups:true})

 强制索引
hint命令可以强制使用某个索引

db.ttlsa_posts.find({pid:{$lt:333}}).hint({pid:1,date:1})

8. 删除索引
删除集合所有索引:

> db.collection.dropIndexes()

删除集合某个索引:

> db.collection.dropIndex({x:1})