美文网首页
数据读写机理小探之顺序读写

数据读写机理小探之顺序读写

作者: 淡淡的小番茄 | 来源:发表于2021-06-07 08:06 被阅读0次

    如何磁盘读写能力

    背景

    由于机械磁盘的局限性,读写一条数据的时候,都会有寻址的过程,而此过程目前是通过机械运动来实现的(磁盘旋转、磁头移动等)。

    这个过程是比较慢的,以7200转速的磁盘,平均寻址时间一般来说10ms左右。

    局部性原理

    如何提升读写性能,其实就是减少IO操作。

    这就让我想到了局部性原理:

    局部性原理是指无论程序指令还是数据都趋于聚集在一个较小的连续区域中。

    有如下三种分类:

    时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。

    程序循环、[堆栈] 等是产生时间局部性的原因。

    空间局部性(Spatial Locality):在最近的将来将用到的信息很可能与正在使用的信息在空间地址上是临近的。

    顺序局部性(Order Locality):在典型程序中,除转移类指令外,大部分指令是顺序进行的。[顺序执行] 和非顺序执行的比例大致是5:1。此外,对大型[数组] 访问也是顺序的。指令的顺序执行、数组的连续存放等是产生顺序局部性的原因。

    顺序读写

    操作系统在进行IO读取的时候,采用了预读的方式,以此减少IO操作。预读的长度一般为页(page)的整倍数。

    数据库在选择索引的数据结构时,利用了局部性原理和磁盘预读的相关概念,选择了B+树作为索引结构。

    数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页(4KB),这样每个节点只需要一次I/O就可以完全载入。

    B+数的高度一般不会超过3层,数据是临近的,也符合局部性原理。

    树的高度小,也提升了检索速度。

    对于数据的更新,由于磁盘是通过物理运动来实现磁盘的读写,所以他无法做到并发的读写,机械磁头就是一个,读A区域的数据,如果要读B区域,需要机械的运动到B区域。由于是机械运动,这个移动的成本还是比较高的。所以建议进行预读,而且顺序写性能是相当高的。

    数据库为了解决写入的一致性这个问题,就有了锁的概念,写锁是排他锁。A线程写入的时候,不允许其他线程进行写入,只能等待。

    多版本控制

    对于读和写,通过MVCC,版本控制来解决。

    通过在一行的计量上,增加版本号,和删除标识来实现。修改行数据的时候,是拷贝一行。此时别的线程进行读的是之前的版本,也就是镜像读。

    修改完成后会将之前的版本置为已删除,最新记录为当前版本。标识已删除的记录,定期会进行清理。

    比如mysql、hbase都是这么实现的。

    相关文章

      网友评论

          本文标题:数据读写机理小探之顺序读写

          本文链接:https://www.haomeiwen.com/subject/lbgzsltx.html