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