数据库相关
存储类型
存储类型 | 特点 |
---|---|
行存储 | 写入效率高,读取效率低 |
列存储 | 读取效率高,写入效率低 |
mysql-行存储
mongodb - 文档存储(es、oss...)
postgresql - 行存储 + 列存储的结合
hbase - 分布式存储...
索引结构
红黑树
可以理解为一个二叉平衡树,通过一些自旋等手段保持平衡。所有根节点到子节点经过的红色节点个数不会相差一个。
mysql未采用此种结构存储索引。 主要原因比较占空间(所有的值都在树上,不适用与做索引)
B树
定义为范围结构,但是节点包含数据内容。占用空间较大
[10,id][20id] --> [1,id][15,id][25,id]
B+树
对B树的优化,只有叶子节点指向一个4K的内存空间的引用,非叶子节点不包含数据,只划定范围。占用空间小。
类型 | 描述 | 用途 |
---|---|---|
聚簇索引 | 节点不存储数据,使用树的范围结构定位到 4KB 的链表块,链表用于范围查询 | 数据行的物理存储组织 |
辅助索引 | 非主键的索引,使用键定位到主键,再通过主键查询实际记录 | 非主键字段的查询支持 |
问题:
为什么辅助索引需要查询到主键,再使用主键索引查询到数据?
理解:
辅助索引不存储数据行,指向主键;
主键查找更高效;
辅助索引类型问题,数据重复等查找不方便。
事务特性
A 原子性 : 最小执行单元
C 一致性 : 所有操作要么成功要么失败
I 隔离性 : 互相隔离
D 持久性 : 持久到磁盘
事务隔离级别
读未提交 : 未提交的数据允许被读取。脏读、幻读。
读已提交 : 其他事务多次执行的结果,可以在当前事务中读取到。(每次读取数据可能不一致导致幻读)
可重复读(mysql innodb默认隔离级别):每次读取数据一致。
串行化:单线程执行。
概念:
脏读:读到未提交的诗句
幻读:一次事务中读取到的数据行数不一致。
不可重复读:一次事务中读取的的同一行数据不一致。
锁:
mysql默认隔离级别下(可重复读),在每次事务中,更新行时,会上一个行锁,当其他事务再读取或者写入,会阻塞。
查询操作时,加上for update会强制上行锁(读锁)。
写锁&&读锁 ×
写锁&&写锁 ×
读锁&&读锁 √
MVCC:
innodb如何实现可重复读的隔离级别呢?
通过MVCC(多版本并发控制),每次开一个事务都会携带一个版本号,读取到的数据都是版本号比它小的内容。
更新
[Data1 v4] [Data2 v4] [Data3 v4]
T1 v5 --> updateData ---> copyData ---> [Data1 v5] [Data1 v4][Data2 v4] [Data3 v4]
T2 v4 --> selectData ---> [Data1 v4][Data2 v4] [Data3 v4]
更新数据时,T1会将数据拷贝一份,创建为V5,不影响其他事务的读取和写入。实现隔离。
插入
T1 v5 ---> copyData ---> [Data1 v4][Data2 v4] [Data3 v4][Data4 v5]
与更新类似。
删除
Data v4
T1 v5 --> deleteData---> [Data1 v4 delete:v5] [Data2 v4] [Data3 v4]
删除类似更新,会打上delete标记v5