yehao
发布于 2023-12-04 / 21 阅读
0
0

数据库相关

数据库相关

存储类型

存储类型

特点

行存储

写入效率高,读取效率低

列存储

读取效率高,写入效率低

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


评论