MySql索引机制之磁盘I/O与磁盘预读

磁盘I/O与磁盘预读

磁盘I/O

先简单介绍一下磁盘I/O和预读,磁盘以扇区大小的块来读写数据,对扇区的访问时间主要有3个组成部分:寻道时间、旋转时间和传送时间。

寻道时间

为了读取某个扇区的内容,传动臂需要首先将读写头定位道包含目标扇区的磁道上,移动传动臂所需要的时间成为寻道时间。寻道时间依赖于读写头原本的位置和传动臂在磁盘上的移动速度,主流磁盘一般在3~9ms,最大寻道时间在20ms。

旋转时间

一旦读写头定位道了期望的磁道,驱动器等待目标扇区的第一个位旋转道读写头下,这个步骤的性能依赖于读写头到达目标扇区和磁盘的选择速度。

传送时间

当目标扇区的第一位位于读写头下,驱动器就可以开始读或者写该扇区的内容了。一个扇区的传送速度依赖于旋转速度和每条磁道的扇区数目。相对于前两个时间,读写数据过程中,传送时间可以忽略不计。

逻辑磁盘块

现代磁盘构造复杂,有多个盘面,盘面又有不同的记录区,为了屏蔽复杂性,现代磁盘将它们组织成一种简单的视图,一个 B 个扇区大小的逻辑块序列,编号 0,1 …… B-1。磁盘中有一个名为磁盘控制器的固件设备,维护者逻辑块号和实际物理磁盘扇区之间的映射关系。
当操作系统想要执行一个 I/O 操作时,例如读取一个磁盘扇区的数据到主存,它就会发送一个命令到磁盘控制器,让它读取某个逻辑块号,控制器上一个固件会将逻辑块号翻译为由盘面磁道扇区三个元素组成的三元组,这个三元组唯一标识了一个物理扇区,然后驱动器将读写头移动到指定位置,将数据读到主存。

磁盘预读

因为主存和磁盘访问效率的巨大差异,磁盘 I/O 变成了一个很重量级的操作,因此需要尽可能减少磁盘 I/O 的次数,为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是局部性原理,即当计算机访问一个地址的数据的时候,通常与其相邻的数据也会很快被访问到。

预读的长度一般为页(page)的整倍数,页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为 4K),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

B+ 树的优势

上文我们介绍了磁盘读取的一些知识,结合我们之前说的 —— 索引结构的优劣与磁盘 I/O 次数大小紧密相关。因此合适的索引结构必定能最大限度发挥磁盘的性能,那 B+ 树又是如何做到的呢?

从 B+ 树的结构中可知,如果树高是 h 的话,访问一个叶子节点需要经过 h 次查询操作,也即访问 h 个节点。考虑索引实际上存储在磁盘上,载入索引节点的过程需要经历磁盘 I/O,B+ 树由于出色的高度控制,导致 h 的值不会太大,一般来说百万数量级可以控制在 2 ~ 4 左右,意为访问节点的数量主需要 2 ~ 4 个。

数据库系统的设计者又巧妙利用了磁盘预读原理,将一个节点的大小设置成一个页,这样每个节点只需要一次磁盘 I/O 就可以载入主存。这样的话,B+ 树访问一个叶子节点需要 h-1 次磁盘 I/O 就可以,因为其根节点是常驻内存的,极大减少了磁盘 I/O 次数,提高了索引结构的效率

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值