简介
MongoDB:文档型数据库,按照文档的形式存储
- Web App(用的较多)
数据库管理系统(DBMS)
- 需要把具体如何实现的如 增删改查 隐藏在系统软件中,对用户软件透明
基础概念:
- 文档(数据模型) 【关系数据库的数据模型是表格】
- 用<key/attribute,value>存放,json的格式
- 一个文档里还可以包括子文档
- 每个文档都有个_id,如果在一个文档中没有说_id是什么,数据库会自动分配一个,可以通过_id找到数据库的任何一个文档
- 一个文档可以是做一个对象(json)
文档集(collection)
- 文档的集合(一个文档集可以视为一类对象)
数据库(database)
- 若干个文档集构成一个数据库
- 部署在一个服务器上,【一般】一个数据库对应一个应用
文档的访问接口
- 插入文档
- db.foo.insert({“bar”:”baz”})
- db:datebase foo:collection
- db.foo.batchinsert() 批量插入
- db.foo.insert({“bar”:”baz”})
- 查找文档
- db.blog.find() [查blog文档集的所有文档]
- Joe=db.people.findOne({“name”:”joe”,”age”:20}); [查people文档集特定属性的文档]
- db.users.find({},{“username”:1,”email”:1}) [只返回users文档的username,email这两个属性、前面的空括号表明不限定如何查询条件,如果这里去掉后面两个属性就变成查询条件了]
- db.users.find({“age”:{“$gte”:18,”$lte”:30}}) 【查年龄在18~30的用户文档】
- db.raffle.find({“ticket_no”}:{“$in”} :{ [725,542,390]}})
- 删除文档
- db.foo.remove()
- db.mailing.list.remove({“opt-out”:true})
- 更新文档
- db.users.update({“_id” : ObjectId(“28h32j223e92e”)},…{“$set” : {“favorite book” : “War and Peace”}}) 【$set指置换】
- db.games.update({“game” : “pinball”, “user” : “joe”},…{“$inc” : {“score” : 50}})
文档模型的设计思想
- 优点:每个元素都被视为对象(储存为json格式)
存储器件
数据处理性能的宗旨
- 提高数据访问的局部性:
- 对磁盘/闪存而言
- 减少I/O的次数;
- 变随机访问为顺序访问。
- 对内存而言
- 增加Cache的命中率
数据库的基本存储架构
- 以页为单位存放数据。每一页为512bytes的整数倍,4KB到4MB。
索引:
- 对于非聚集索引,有些查询甚至可以不访问数据页。
聚集索引可以避免数据插入操作集中于表的最后一个数据页。
当然,众所周知,虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引。
B-Tree
B-Tree的平衡性
- 每个节点的大小固定(e.g. 4KB或8KB),因此最多只能容纳n个键和n+1个指针。
什么决定B-Tree的效率?
- 树的高度决定查询需要I/O次数。
- 对于同样规模的数据,n越大树的高度越低。
- 为了提高B-Tree的效率,我们需要增加n,即增加每个节点容纳键和指针的数量。
- 用简短的数据类型定义键的属性,e.g. smallint.
- 对B-Tree进行压缩。