通常来说,业务应用系统 = 数据存储 + 逻辑处理 + 网络传输。其中的数据存储是系统的根基。
在业务应用系统中,需要持久化到磁盘的数据,一般保存在这些存储系统中:
- 关系型数据库:mysql,等
- 键值系统(NOSQL):redis,等
- 搜索引擎:ElasticSearch,等
- 文件系统:图片、视频等独立文件,log日志,等
存储系统的功能包括:增、删、查、改。其中,读又分为随机读取和顺序扫描。
磁盘数据存储结构有:
- 随机查找型:
- B树、LSM树
- 哈希
- 顺序扫描型:
- 文件append
磁盘机制
内存 vs 磁盘:内存数据在电脑断电重启后会丢失,所以要保存下来的数据文件都需要持久化到磁盘。
磁盘读写时涉及到磁盘上数据查找,数据地址一般由柱面号、盘面号和块号三者构成。磁盘读取依靠的是机械运动,也就是说移动臂先根据柱面号移动到指定柱面,然后根据盘面号确定盘面的磁道,最后根据块号将指定的磁道段移动到磁头下,便可开始读写。
整个过程主要有三部分时间消耗:查找时间(seek time) 、等待时间(latency time)、传输时间(transmission time) ,分别表示定位柱面的耗时、将块号指定磁道段移到磁头的耗时、将数据传到内存的耗时。
其中整个磁盘IO最耗时的地方在查找时间(即磁盘寻道),顺序访问的查找时间开销比较小,随机访问则需要较长的磁盘寻道时间。
![8d52503314bd3fa295d1c96cbc86143f.png](https://img-blog.csdnimg.cn/img_convert/8d52503314bd3fa295d1c96cbc86143f.png)
15000转的SATA盘的顺序读取带宽可以达到100MB/s以上,则顺序读取1MB数据的耗时为100KB / 100MB/s * 1000 = 1ms;而磁盘寻道的耗时则需要10ms。
可以看出,磁盘顺序读写数据的带宽还是不错的;存储系统的性能瓶颈主要在于磁盘随机读写:
从磁盘读取100KB数据的耗时 = 磁盘寻道时间10ms + 数据读取时间1ms = 11ms
如果能尽量避免磁盘随机读写,尽量减少磁盘寻道的次数,则可以很大地提升存储系统的性能。比如,将随机读写转化为顺序读写,通过缓存减少磁盘随机读写,等。
![a66653ffb0aa63c1d116ee98660301dc.png](https://img-blog.csdnimg.cn/img_convert/a66653ffb0aa63c1d116ee98660301dc.png)
B-tree
B树存储引擎是B树的持久化实现,不仅支持单条记录的增、删、查、改,还支持顺序扫描。
通常用于实现关系型数据库。
平衡二叉树、B树、B+树
先回忆下,平衡二叉树、B树、B+树是长什么样子的:
- 平衡二叉树:平衡查找树,即每次插入后都会通过旋转节点保持平衡的有序二叉树
![96638c2afdadae4124febe53730e11c9.png](https://img-blog.csdnimg.cn/img_convert/96638c2afdadae4124febe53730e11c9.png)
- B树:多路平衡查找树
![847b6bbe33330b731874fb478662e159.png](https://img-blog.csdnimg.cn/img_convert/847b6bbe33330b731874fb478662e159.png)
- B+树:多路平衡查找树
与B树最大的不同是内部结点不保存数据,只用于索引;所有数据(或者说记录)都保存在叶子结点中;叶子结点本身依关键字的大小自小而大顺序链接;并且每个叶子结点都存有相邻叶子结点的指针。