Mysql高级 局部性原理和磁盘预读

一、局部性原理

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

1.1 局部性分类

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

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

如果一个数据被访问了,那么它相邻的数据也很快会被访问。

  • 空间局部性(Spatial Locality):在一个时间段内,仅使用整个磁盘的一小部分数据,在最近的将来将用到的信息很可能与正在使用的信息在空间地址上是临近的。

  • 顺序局部性(Order Locality):在典型程序中,除转移类指令外,大部分指令是顺序进行的。[顺序执行] 和非顺序执行的比例大致是5:1。此外,对大型[数组] 访问也是顺序的。指令的顺序执行、数组的连续存放等是产生顺序局部性的原因。
    操作系统从磁盘读取文件的时候,分为顺序读写、随机读写、4K读写等方式,寻址,磁臂。

1.2 更加接地气的说明

您可以把操作系统的局部性原理想象成一个人在看书的过程。当一个人在看书时,他不会随机地翻开任何一页,而是会按照一定的顺序,从前往后,或者从后往前,或者从中间开始,一章一章地看。这就是空间局部性,也就是说,一个人在一段时间内,只会看到书中的一部分内容,而不是全部内容。

同时,当一个人在看书时,他也不会只看一遍就完事,而是会反复地回顾和复习,特别是对于重要或者难懂的内容。这就是时间局部性,也就是说,一个人在一段时间内,会多次看到同样的内容,而不是只看一次就忘记。

操作系统的局部性原理就是基于这样的现象,设计了一些技术,来帮助程序更快地运行。比如,操作系统会把程序中经常用到的数据或者指令,放在一个叫做缓存的地方,这样程序就可以快速地访问,而不用花时间去找。这就像一个人在看书时,会把重要的内容做个笔记,或者用个便签贴在书上,这样他就可以方便地回顾,而不用翻来翻去。

1.3 局部性在存储中的应用

img

二、磁盘预读

2.1 原理分析

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

计算机系统是分页读取和存储的,一般一页为4KB(8个扇区,每个扇区125B,8*125B=4KB),每次读取和存取的最小单元为一页,而磁盘预读时通常会读取页的整倍数。根据文章上述的【局部性原理】①当一个数据被用到时,其附近的数据也通常会马上被使用。②程序运行期间所需要的数据通常比较集中。由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),所以即使只需要读取一个字节,磁盘也会读取一页的数据。

至于磁盘分页,参考计算机操作系统的分页,分段存储管理——逻辑地址和物理地址被分为大小相同的页面,逻辑地址中叫页,物理地址中叫块。

2.2 意义分析

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

数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页(4KB),这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:

每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logmN)。一般实际应用中,m是非常大的数字,通常超过100,因此h非常小(通常不超过3)。

综上所述,用B-Tree作为索引结构效率是非常高的。

而红黑树这种结构,h明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,所以红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差很多。

举例说明

B-Tree:如果一次检索需要访问4个节点,数据库系统设计者利用磁盘预读原理,把节点的大小设计为一个页,那读取一个节点只需要一次I/O操作,完成这次检索操作,最多需要3次I/O(根节点常驻内存)。数据记录越小,每个节点存放的数据就越多,树的高度也就越小,I/O操作就少了,检索效率也就上去了。

B+Tree:非叶子节点只存key,大大滴减少了非叶子节点的大小,那么每个节点就可以存放更多的记录,树更矮了,I/O操作更少了。所以B+Tree拥有更好的性能。

转载:Mysql高级(九)局部性原理和磁盘预读

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值