从需求出发来看关系模型与非关系模型--关系模型与非关系模型概述
1.层次模型
2.关系模型
3.ORMapping的作用:将对象模型转换为关系模型
互联网在线处理的需求排序列表基本上可以认为是: 数据的扩展性>请求的响应时间尽可能短>down机时间尽可能短>成本尽可能低>可自动快速恢复>数据的读取一致性>程序开发者的方便与快速响应需求。
数据库核心组件
映射(map)
存储数据并提供查询的结构
预写式日志(write-ahead logging,WAL)
记录每一次写操作
触发器(trigger)
锁(lock)
保证一个逻辑原子操作的完整性
排它锁(写锁)和共享锁(读锁)
执行优化器
输入 为 sql 的抽象语法树(ast),输出为执行计划
sql 解析器
将 sql 转化为抽象语法树
存储过程
核心目标: 让数据库端能够运行逻辑代码
优势:性能好,因为直接与内存交互,没有网络通信 延迟小 吞吐量大
可以用来封装一些需要该性能的小的逻辑单元
劣势:需要绑定到特定的数据库,大部分存储过程是面向过程的代码,运维难度比较大,不适合复杂业务逻辑
视图
空间换时间,利用不确定性变成确定性的方式,实现 join 查询速度的优化和聚焦
从外部查询看数据库的内部实现机制
李雷和韩梅梅的一次转账事务--事务系统概述
事务的 ACID
原子性 一致性 隔离性 持久性
隔离性的四个隔离级别 其实是对一致性和性能之间的一种取舍
数据的存储介质-磁盘的硬件特性
数据的存储介质-磁盘的RAID
数据的存储介质-固态存储SSD
数据映射--映射概述
数据映射--有序数组
数据映射--平衡二叉有序树
二叉树特性:
- 有一个 ROOT(根)节点 (数据访问起点)
- 一个节点有两个子节点
- 父节点都有一个到子节点的引用(指针)
二叉排序树: - 左子节点上的数据一定比父节点的数据小,右子节点的数据一定比父节点的数据大
平衡二叉树:
一个空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
平衡二叉排序树:
满足以上条件
中序遍历平衡二叉树其实就是对数据的有序遍历
左根右的顺序
让树能够保持有序的前提下尽可能平衡的主要方式
AVL,Tree Heap,红黑树
分层 高层数据少
最底层 level0 保存所有数据
写入时从最底层写入
读取时从最高层开始读
写入时通过计算概率决定是否向上层推
问题:为什么 B 树用数组结构实现而不是链表
答:数组结构(有序)能够进行二分查找
映射的存储模型 – 面向列的存储和行存储
映射的存储模型 – 列存储
SQL解析与优化器 – 概述
SQL解析与优化器 - 基于行存储的单表查询
SQL解析与优化器 - 基于列存储的单表查询
SQL解析与优化器 - 倒排索引(上)
分词 相关性
inner join ,最强约束匹配,只有全部符合的数据才会留下。
Left join ,保留左表内所有数据,右表无对应的用NULL代替。
right join 保留右表内所有数据,左表无对应的用NULL代替。
Full join 保留左右表内所有数据,对应表内无对应的用NULL代替。
Cross join 将左表内的每一行数据与右表内的每一行数据进行关联后输出。笛卡尔积
join 算法
Nested loop
hash join
sort merge join
Nested loop 和hash join ,都能够比较轻松的处理小表和大表的取交集场景,其中nested loop要求大表有索引,如果小表可以完全的被放到内存中,那么hash join是一个比较好的处理大小表join的方式。
Sort merge join 则要求两张表都需要按照匹配条件排序,这个的构建成本略高,但它的优势是,排序过程对内存要求较低,并且可以充分的并行执行,因此可以发现,它经常出现在列存,倒排索引等各类条件变化频繁,数据量非常大的场景中。
这类操作的核心就是帮助用户进行数据统计和分析。
对于group by ,一般的算法就是把数据按照by 后面的条件放到一个HashMap里,然后按照aggregation function(count,sum,max,min)进行一下聚合统计,然后走having进行结果集过滤就好
而对于order by ,如果order by的条件恰好在索引上,那么可以认为数据本身就是有序的,因此不需要其他处理,直接使用索引进行处理即可。
当然,如果没有索引,那么就需要创建一个临时表,然后在临时表内对数据进行排序
海量数据-事务原子性
海量数据-事务一致性1
海量数据-事务一致性2
海量存储之十六--一致性和高可用专题
2pc 脑裂
3pc
paxos zab