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