(总共4个部分,静下心来,玩转mongodb; 刚学还是热乎的,传上来不容易,欢迎指正学习!)
**
索引
**是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构;
索引记录中存有索引关键字和指向真正数据的指针。因为索引中只存关键字和指针所以索引的规模要比真正的表的规模小很多。其单独存放,且查询方式不一,mongodb的索引查询时用的为B树查询;
- 性能分析函数(explain)
首先插入10w数据
name字段没有建立任何索引,查询一个“name10000”的姓名,性能分析
cursor:”BasicCursor”,就是说这里的查找采用的是“表扫描”,也就是顺序查找,
nscanned: 这里是10w,也就是说数据库浏览了10w个文档,
n: 这里是1,也就是最终返回了1个文档。
millis: 总共耗时114毫秒。
建立索引(ensureIndex),再次查询分析
cursor: ”BtreeCursor”,采用B树的结构来存放索引,索引名为后面的“name_1”。
nscanned: 数据库只浏览了一个文档就OK了。
n: 直接定位返回。
db.col.ensureIndex({“title”:1,”description”:-1}) 建立索引,1升,-1降
db.person.ensureIndex({“name”:1},{“unique”:true}) 建立唯一索引
也可以使用 hint 来强制 MongoDB 使用一个指定的索引。这种方法某些情形下会提升性能。
db.users.find({gender:”M”},{user_name:1,_id:0}).hint({gender:1,user_name:1})
索引不能被以下的查询使用:
• 正则表达式及非操作符,如
nin,
not, 等。
• 算术运算符,如
mod,等。∙
where 子句
所以,检测你的语句是否使用索引是一个好的习惯,可以用explain来查看
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
(1).数据库用户角色
针对每一个数据库进行控制。
read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.
(2).数据库管理角色
每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考: http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin)
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。