一、索引基础:
MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧。下面是创建索引的命令:
> db.test.ensureIndex({"username":1})
> db.test.getIndexes()
> db.test.dropIndex({"username":1})
-- 数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储。 > db.test.ensureIndex({"username":1, "age":-1})
> db.test.find({"age": 30, "username": "stephen"})
> db.test.ensureIndex({"comments.date":1})
> db.test.ensureIndex({"username":1},{"name":"testindex"})
> db.test.ensureIndex({"userid":1},{"unique":true})
> db.test.insert({"userid":5}) > db.test.insert({"userid":5}) E11000 duplicate key error index: test.test.$userid_1 dup key: { : 5.0 }
> db.test.insert({"userid1":5}) > db.test.insert({"userid1":5}) E11000 duplicate key error index: test.test.$userid_1 dup key: { : null }
> db.test.dropIndex({"userid":1}) --插入测试数据,以保证集合中有重复键存在。 > db.test.remove() > db.test.insert({"userid":5}) > db.test.insert({"userid":5}) --创建唯一索引,并消除重复数据。 > db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true}) --查询结果确认,重复的键确实在创建索引时已经被删除。 > db.test.find() { "_id" : ObjectId("4fe823c180144abd15acd52e"), "userid" : 5 }
> db.test.ensureIndex({"userid":1,"age":1},{"unique":true})
三、使用explain:
explain是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用该方法,就可以得到查询细节。explain会返回一个文档,而不是游标本身。如:
> db.test.find().explain() { "cursor" : "BasicCursor", "nscanned" : 1, "nscannedObjects" : 1, "n" : 1, "millis" : 0, "nYields" : 0, "nChunkSkips" : 0, "isMultiKey" : false, "indexOnly" : false, "indexBounds" : {} }
system.indexes集合中包含了每个索引的详细信息,因此可以通过下面的命令查询已经存在的索引,如:
> db.system.indexes.find()
> db.test.ensureIndex({"username":1},{"background":true})