如果你把东西整理得井井有条,下次就不用查找了

​ --------德国谚语

​ 从最基本的层面上看,数据库只需要做两件事:向它插入数据时,它就保存数据;之后查询时他就返回数据。接下来也就围绕着查询和存储这两个话题展开,存储时有两种比较常用的数据结构LSM和B-Tree,基于数据的查询根据不同的应用场景可以分为两种方式事务处理(OLTP)和分析处理(OLAP)。

LSM数据结构

​ LSM数据结构早期是应用于日志结构文件系统上的,是一种基于合并和压缩的排序文件索引的存储引擎,在leveldb,rocksdb等存储系统上有广泛的应用。

​ 它是以一种顺序写的方式将值写磁盘,相比于随机写速度上有大大的提升。对于写入的数据在磁盘上保证顺序性,键值可以采用稀疏的方式存储在内存,查询时可以定位数据的范围,在节省内存的同时加快查询的速度。当插入的数据达到一定量时,对数据块进行合并压缩处理。

1.文件格式

​ 二进制的方式进行存储。

2.删除记录

​ 不直接删除数据,而是采用标记位的方式表示已删除,在合并的时候丢弃。

3.崩溃恢复

​ 对于写入内存的数据通过追加磁盘日志的方式备份,可以及时恢复。

4.部分写入的记录

​ 增加校验位处理,对于不完整的数据丢弃。

5.并发控制

​ 因为是顺序写的方式,以一个线程写,多个线程读的方式来实现并发。

6.保证磁盘数据顺序性

​ 可以采用跳表,红黑树等数据结构实现

7.对于不存在的数据提升查询性能

​ 可以采用布隆过滤器的方式

B-Tree数据结构

​ B-Tree是目前广泛使用且比较成熟的数据库底层存储结构,mysql就是采用该数据结构实现的。B-tree将数据库分解成大小固定的块或页,通常为4KB,类似于底层磁盘的块排列方式,可以让一个页面引用另一页面,构造一个树状页面。数据是以顺序的方式排列,插入时需要找到键的位置,如果此时改块已满需要进行分裂操作。

1.可靠性

通过预写日志(WAL)的方式存储数据库的操作,防止系统崩溃时数据丢失。

2.节省内存

保存键的缩略信息,而不是完整的键,这样可以节省空间。

3.大范围查询

相邻的页在磁盘中顺序存储,减少磁盘IO

4.查询速度

可以增加兄弟指针,这样可以不用返回父指针再访问一次

5.LSM和B-Tree对比

LSM整体的写性能比B-Tree好,数据的压缩性能更好。B-Tree整体的读性能更加优异,且在合并压缩这块不需要消耗更多的性能,支持事务语义。需要根据实际应用的场景,选择相应的数据结构。

事务处理与分析处理

在线事务处理指的是日常程序中的增删改查操作,在线分析处理主要是事后对数据分析,涉及数据量较大,且一般读取的是某几列的值。

属性事务处理系统分析系统
主要读特征基于键,每次查询返回少量的记录对大量记录进行汇总
主要写特征随机访问,低延迟写入用户的输入批量导入或事件流
典型使用场景终端用户,通过网络应用程序内部分析师,为决策提供支持
数据表征最新的数据状态随着时间而变化的所有事件历史
数据规模GB到TBTB到PB

列式存储

如果事实表中有数以万亿行,PB大小的数据,则高效地存储和查询这些数据将成为一个具有挑战性的问题。面向列存储的想法很简单:不要将一行的所有值存储在一起,而是将每列的所欲值存储在一起。列式存储可以方便数据的压缩,可以节省存储空间。

作为应用开发人员,掌握更多有关存储引擎内部的知识,可以更好地了解哪种工具最适合你的具体应用。


willian
9 声望1 粉丝

一枚开始记载自己成长日记的程序员