mongo索引
2015-07-06 18:47
471 查看
mongo索引和关系型数据库相似。
语法如下:db.people.ensureIndex("username":1)。按照username首字母升序排列。同样的索引只会创建一次,对对某个键的索引只会加速该键的查询,对其他查询可能没有什么帮助。并不是索引越多越好,索引会增加数据库插入非常慢,占用很多空间,并且还可能对查询的速度没啥帮助。
但是没有索引,服务器会“查询怎本书”,做表扫描。当集合很大时,就会很慢。
综上,要合理的创建索引,考虑一下问题:
1.做什么样的查询?那些键需要索引?
2.每个键的索引方向是什么样的?
3.如何应对扩展?有没有不同的键的排列可以使常用数据更多的保留在内存中?
一 为排序创建索引,如果对没有索引的键调用sort,mongodb会将数据提取到内存中来排序。因此,不可能在内存中对数据库做T级别以上的排序。
二 索引名称,默认的索引名称为keyname1_dir1_keyname2_dir2...其中keyname表示索引的键,dir表示方向(1或-1)。也可自定义索引:
db.dbname.ensureIndex({"a":1,"b":1},{"name":"indename"})
三 唯一索引,确保集合每一个文档制定的键都有唯一的值。如保证每个“username”键都有不一样的值
db.dbname.ensureIndex({"username":1},{"unique":true})。但是insert并不检查文档是否插入过了,所以要用安全插入才能在有重复键时,有错误提示信息。
_id是在创建普通集合时就一同创建的。是不能删除的。如果没有对应的键,索引会将其作为null存储。所以如果对某个键创建唯一索引,但是插入时有不存在时,就会插入null,再次插入就会重复,出错。
四 消除重复,当数据库已经有了重复的值时,创建重复索引就是失败的。
可通过 db.dbname.ensureIndex({"username":1},{"unique":true,"dropDups":true})保留发现的第一个文档,删除剩下的其他文档。
五 复合索引,创建复合唯一索引,单个键的值可以相同,只要所有的键的值组合起来不一样就好。
如:{files_id: ObjectId("xxxxx"),n:1}
{files_id: ObjectId("xxxxx"),n:2} ObjectId一样,但是n的值不一样。
六 explain和hint的用法。
explain会返回查询使用的索引情况,耗时,及扫描的文档数的统计信息。
db.dbname.find({"age":18}).sort({"username":1})
输出如下
"cursor":"BasicCursor"表示该查询没有用到索引,
"nscanned":64 表示数据库查询了多少文档。该值越接近返回的结果值越好。
"n":64 表示返回的结果值
"millis":0表示数据库查询的时间
假设现在有一个“age”键的索引,现在查询20到30岁的用户
"cursor":"BtreeCursor age_1"索引存在B树,所以就有个BtreeCursor类型的游标。可以通过名字查询更近一步信息,
db.system.indexes.find({"ns":"test.c","name":"age_1"}),要是索引有相互重叠,查询也很复杂,“allPlans”就会包含所以可能用到的尝试。
如果发现mongodb用了其他非预期索引,可用hint强制使用某个索引。
例如,希望使用{"username":1,"age":1}索引。db.dbname.find({“age”:14,"username":/.*/}).hint({"username":1,"age":1})
最后,索引管理
索引的元信息存储在每个数据库的system.indexes集合中。
还有地理空间索引,专为GPS设置的,有兴趣的同学可以自己去看看。在此不作表述。
语法如下:db.people.ensureIndex("username":1)。按照username首字母升序排列。同样的索引只会创建一次,对对某个键的索引只会加速该键的查询,对其他查询可能没有什么帮助。并不是索引越多越好,索引会增加数据库插入非常慢,占用很多空间,并且还可能对查询的速度没啥帮助。
但是没有索引,服务器会“查询怎本书”,做表扫描。当集合很大时,就会很慢。
综上,要合理的创建索引,考虑一下问题:
1.做什么样的查询?那些键需要索引?
2.每个键的索引方向是什么样的?
3.如何应对扩展?有没有不同的键的排列可以使常用数据更多的保留在内存中?
一 为排序创建索引,如果对没有索引的键调用sort,mongodb会将数据提取到内存中来排序。因此,不可能在内存中对数据库做T级别以上的排序。
二 索引名称,默认的索引名称为keyname1_dir1_keyname2_dir2...其中keyname表示索引的键,dir表示方向(1或-1)。也可自定义索引:
db.dbname.ensureIndex({"a":1,"b":1},{"name":"indename"})
三 唯一索引,确保集合每一个文档制定的键都有唯一的值。如保证每个“username”键都有不一样的值
db.dbname.ensureIndex({"username":1},{"unique":true})。但是insert并不检查文档是否插入过了,所以要用安全插入才能在有重复键时,有错误提示信息。
_id是在创建普通集合时就一同创建的。是不能删除的。如果没有对应的键,索引会将其作为null存储。所以如果对某个键创建唯一索引,但是插入时有不存在时,就会插入null,再次插入就会重复,出错。
四 消除重复,当数据库已经有了重复的值时,创建重复索引就是失败的。
可通过 db.dbname.ensureIndex({"username":1},{"unique":true,"dropDups":true})保留发现的第一个文档,删除剩下的其他文档。
五 复合索引,创建复合唯一索引,单个键的值可以相同,只要所有的键的值组合起来不一样就好。
如:{files_id: ObjectId("xxxxx"),n:1}
{files_id: ObjectId("xxxxx"),n:2} ObjectId一样,但是n的值不一样。
六 explain和hint的用法。
explain会返回查询使用的索引情况,耗时,及扫描的文档数的统计信息。
db.dbname.find({"age":18}).sort({"username":1})
输出如下
"cursor":"BasicCursor"表示该查询没有用到索引,
"nscanned":64 表示数据库查询了多少文档。该值越接近返回的结果值越好。
"n":64 表示返回的结果值
"millis":0表示数据库查询的时间
假设现在有一个“age”键的索引,现在查询20到30岁的用户
"cursor":"BtreeCursor age_1"索引存在B树,所以就有个BtreeCursor类型的游标。可以通过名字查询更近一步信息,
db.system.indexes.find({"ns":"test.c","name":"age_1"}),要是索引有相互重叠,查询也很复杂,“allPlans”就会包含所以可能用到的尝试。
如果发现mongodb用了其他非预期索引,可用hint强制使用某个索引。
例如,希望使用{"username":1,"age":1}索引。db.dbname.find({“age”:14,"username":/.*/}).hint({"username":1,"age":1})
最后,索引管理
索引的元信息存储在每个数据库的system.indexes集合中。
还有地理空间索引,专为GPS设置的,有兴趣的同学可以自己去看看。在此不作表述。
相关文章推荐
- django-simple-captcha refresh & validation
- poj1700多种选择的贪心
- Django模块笔记【五】
- django添加富文本编辑器
- Algorithm: efficient way to remove duplicate integers from an array
- django manage.py 的各种功能
- Sublime Text3 + Golang搭建开发环境
- Django对静态文件的处理——部署阶段
- django框架中,添加用户操作记录和查询功能
- Mongo基本命令
- hdu 1533 Going Home
- fonts.googleapis.com加载慢解决办法
- 【Go】为什么用go; Golang Erlang 前世今生
- history对象back()、forward()、go()方法
- Django模块笔记【四】
- 算法基础:整数排序问题(连续整数只保留首尾两个数字)
- EGOCache如何检测缓存时间过期
- [Django]models定义choices 字典中的页面显示值
- 使用 PyCharm 远程调试 Django 程序
- Binary Tree Traversal Algorithms (二叉树遍历算法)