MySql索引机制之磁盘IO与磁盘预读
磁盘I/O与磁盘预读
磁盘I/O
先简单介绍⼀下磁盘I/O和预读,磁盘以扇区⼤⼩的块来读写数据,对扇区的访问时间主要有3个组成部分:寻道时间、旋转时间和传送时间。
寻道时间
为了读取某个扇区的内容,传动臂需要⾸先将读写头定位道包含⽬标扇区的磁道上,移动传动臂所需要的时间成为寻道时间。寻道时间依赖于读写头原本的位置和传动臂在磁盘上的移动速度,主流磁盘⼀般在3~9ms,最⼤寻道时间在20ms。
旋转时间
⼀旦读写头定位道了期望的磁道,驱动器等待⽬标扇区的第⼀个位旋转道读写头下,这个步骤的性能依赖于读写头到达⽬标扇区和磁盘的选择速度。
传送时间
当⽬标扇区的第⼀位位于读写头下,驱动器就可以开始读或者写该扇区的内容了。⼀个扇区的传送速度依赖于旋转速度和每条磁道的扇区数⽬。相对于前两个时间,读写数据过程中,传送时间可以忽略不计。
逻辑磁盘块
mysql下载哪个盘现代磁盘构造复杂,有多个盘⾯,盘⾯⼜有不同的记录区,为了屏蔽复杂性,现代磁盘将它们组织成⼀种简单的视图,⼀个 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 次数,提⾼了索引结构的效率
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论