不使用索引的查询称为全表扫描。通常来说,应该尽量避免全表扫描,全表扫描的效率非常低。
创建索引:
db.runoob.ensureIndex({"name":1})
- 复合索引
db.runoob.ensureIndex({"name":1,"sex":1})
隐式索引
N个键的索引,同时可以得到这个N个键的前缀组成的索引。
{"a":1,"b":1,"c":1,...,"z":1}索引可以使用{"a":1}、{"a":1,"b":1}、{"a":1,"b","c":1}等一系列索引。低效率索引
查询是否为空会全表扫描,例如({”name":{"$exists" :false}})。在索引中,不存在的字段和null字段存储方式是一样的,查询必须遍历每一个文档检查这个值是否真的为null还是根本不存在。
"$ne"查询效率也比较低。“$ne"虽然可以实用索引,但是必须查看所有的索引条目,而不是指定的条目。
"$nin"总是全表扫描。
"$not" 有时能够使用索引,但是通常它并不知道如何使用索引。它能够对基本范围(比如将{"key" : "$lt" : 7} 变成 { “key" : {"$gte" : 7}}))和正则表达式进行反转。范围查询
当有范围查询和精确查询一起事,精确查询放在前面。OR查询
"$or"查询会对每一个子句都使用索引,因为"$or"实际上是执行两次查询然后将结果集合并。索引对象和数组
可以在嵌套文档和嵌套对象上建立索引,也可以在数组上建立索引,但是不能在数组对象上建立索引。
db.user.ensureIndex({"loc.city":1})
- 索引基数
&emsp 基数是集合中某个字段拥有不同值的数量。例如性别只有两个值:“男”和“女”。一个字段基数越高,这个索引就越有用,可以通过索引迅速找到一个比较小的结果集。 - 索引类型
唯一索引确保集合中每个文档指定键都是唯一值。
db.users.ensureIndex({"username" : 1}, {"unique" : true})
- 索引管理
ensureIndex和dropIndexes建立索引和删除索引。
db.foo.getIndexes() #得到索引信息
索引默认形式是keyname1_dir1_keyname2_dir2_..._keynameN_dirN,keynameX是索引键,dirX是索引的方向(1或者-1)。