首页 > 数据库技术 > 详细

3.MongoDB 索引

时间:2015-01-29 02:09:14      阅读:274      评论:0      收藏:0      [点我收藏+]

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.runCommand({"dropIndexes":"users","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 执行查询的毫秒数

?

(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})

?

?

?

?

?

3.MongoDB 索引

原文:http://sgq0085.iteye.com/blog/2180879

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!