如果你把东西整理得井井有条,下次就不用查找了
--------德国谚语
从最基本的层面上看,数据库只需要做两件事:向它插入数据时,它就保存数据;之后查询时他就返回数据。接下来也就围绕着查询和存储这两个话题展开,存储时有两种比较常用的数据结构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到TB | TB到PB |
列式存储
如果事实表中有数以万亿行,PB大小的数据,则高效地存储和查询这些数据将成为一个具有挑战性的问题。面向列存储的想法很简单:不要将一行的所有值存储在一起,而是将每列的所欲值存储在一起。列式存储可以方便数据的压缩,可以节省存储空间。
作为应用开发人员,掌握更多有关存储引擎内部的知识,可以更好地了解哪种工具最适合你的具体应用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。