3.MongoDB 索引

1.索引的简单使用

(1)创建索引 ensureIndex

避免表扫描,一定要创建查询中用到的所有键的索引,默认最多创建64个

db.users.ensureIndex({"name":1})

联合索引 对单个键不起作用

db.users.ensureIndex({"date":1,"username":1})

 

(2) 查询索引

索引的元信息储存在各个数据库的system.indexes中

通过db.system.indexes.find()可以查询

db.system.namespaces.find()可以看到命名空间

 

(3)删除索引

db.system.indexes.find() 查询system.indexes查询索引名

db.runCommand({"dropIndexes":"foo","index":"id_1_legId_1"})

删除所有用 *

db.runCommand({"dropIndexes":"collectionA","index":"*"})

 

(4)如果有多个键可能需要考虑索引的方向

建立索引时sort中相同 1相当于asc升序 和 -1是desc降序

比如date最好就用 -1 ,当数据量很大的时候,可以将最后几天的索引保存在内存中,有效减少内存交换

 

(5)内嵌文档中的键建立索引

内嵌文档的键建立和普通文档创建索引没有区别

db.blog.ensureIndex({"comments.date":-1})

 

(6)索引命名

通过 db.system.indexes.find(),可以看到索引默认名称为key1_sort_key2_sort,比如date_-1_username_1

可以通过设置name来自己命名

db.foo.ensureIndex({"a":1,"b":1,"c":1},{"name":"alphabet"})

 

2.唯一索引

(1)创建

db.foo.ensureIndex({"bar":1},{"unique":true})

 

(2)消除重复

dropDups选项 将所有包含重复值的文档删掉 

db.foo.ensureIndex({"bar":1},{"unique":true,“dropDups”:true})

 

(3)复合唯一索引

创建复合唯一索引的时候,集合中单独某一个键可以相同,所有键组合起来不相同即可

 

3.使用explain和hint

(1)explain

获取查询执行的细节(用到的索引、结果数量、耗时等),并非真正执行查询

db.users.find().explain()

"cursor" : "BasicCursor" 查询没有使用索引

"nscanned" : 1 代表检查了多个文档

"n" : 1 结果文档记录总数

"millis" : 0 执行查询的毫秒数

 

MongoDB 3.0 需要传入三个参数

 "queryPlanner"(默认) "executionStats" "allPlansExecution". 

 

(2)hint

强制使用某个索引

db.users.find({"age":28,"name":/.*/}).hint({"name":1,"age":1})

 

4.地理空间索引

(1) 说明

例如用于离我最近的N个场所,参数是"2d"

db.map.ensureIndex({"gps":"2d"})

gps的键值对必须是某种形式的一对值:一个包含两个元素的数组或者是包含两个键的内嵌文档,比如

{"gps":[0, 100]}

{"gps":{“x”:-30, "y":30}}

{"gps":{"latitude":-180, "longitude":180}}

 

(2)取值范围

键名可以随意,值的范围是-180~180,如果想用其他值,通过ensureIndex的选项来指定最大最小值

db.users.ensureIndex({"light-years":"2d"},{"min":-1000,"max":1000})

 

 

 

 

 

 

 

猜你喜欢

转载自sgq0085.iteye.com/blog/2180879