从冯诺依曼体系看数据库设计与优化

南宫理的日志录 2024-09-10 14:16:06
0、结论

1)计算机体系架构中,CPU只能读取、处理内存/主存中的数据,从内存读取数据的时间延迟一般是纳秒(ns)级;

2)内存属于易失性存储介质,数据需要持久化存储到辅助存储器/外部存储器中,典型的是磁盘,从磁盘读写数据的时间延迟一般是毫秒(ms)级,跟内存读取速度,存在10^6(百万级)的差距,延迟的大头在于寻道时间+旋转延迟,批量顺序磁盘IO操作,可以更加充分地发挥磁盘性能,使得磁盘的延迟无限趋近于传输时间;

3)数据库设计与优化的底层原理是“局部性原理”,包括时间局部性和空间局部性,这也是计算机科学能够进行相关设计、优化的一个核心基础;

4)以“局部性原理”为基础,数据库设计与优化有两项基本原则:尽量减少磁盘IO次数,必要的磁盘IO则尽量将随机IO转换为顺序IO操作。

1、冯诺依曼体系

冯诺依曼体系(Von Neumann architecture),又称冯诺依曼模型,是计算机架构的一种设计模式,由匈牙利数学家和物理学家约翰·冯诺依曼在1945年提出的。这种体系结构的主要特点是将程序指令存储和数据使用同一存储系统来存储,并且按照顺序执行指令。

冯诺依曼体系是现代计算机的基石,其设计理念基于几个关键原则:

线性存储器:一串有序的存储单元,每个单元可以存储一个指令或数据,并且可以通过地址索引。

程序存储:计算机程序以指令序列的形式存储在内存中,指令可以按顺序或通过跳转指令非顺序执行。

处理单元:包括算术逻辑单元(ALU)和控制单元(CU)的中央处理单元(CPU),负责解释执行指令和进行计算。

输入/输出系统:用于与外部世界交换数据,可以通过多种形式实现,如键盘、鼠标、显示器、网络接口等。

冯诺依曼体系的优点在于其简单和通用的设计,易于理解和编程,而且可以应用于各种不同类型和大小的计算机。但随着时间的推移,其设计限制也逐渐显现:

冯诺依曼瓶颈:CPU在任何时间点只能执行存储器中的一项操作,限制了处理速度和效率。

顺序执行:按照严格顺序执行指令,限制了并行处理的能力。

2、分级存储结构

在计算机体系结构中,主要有高速缓存(Cache)、内存(RAM)和磁盘(HDD和SDD)这三种主要的存储组件。

高速缓存(Cache)

典型的计算机有1M或者更多的高速缓存。高速缓存可以分为两类:

板级高速缓存:位于处理器本身的同一芯片上

附加高速缓存:位于处理器之外的另一个芯片上

当处理器需要数据和指令时,数据和指令就会被从内存移到高速缓存中,处理器访问高速缓存的数据只需要几纳秒。

主存储器(内存)

主存储器也就是内存,是计算机的活动中心。可以粗略的认为,发生在计算机中的每一件事情,不论是指令的执行还是数据的处理,都是作用于驻留在内存的信息上的(尽管实际上通常会将所使用的数据转移到高速缓存中)。

将数据从内存移动到处理器或者高速缓存的速度通常在10-100纳秒的范围内。这个速度,一般被称为“冯诺依曼瓶颈”,突破的手段,就是引入了高速缓存组件。

辅助存储器

典型的辅助存储器就是磁盘,即机械硬盘(HDD)。固态硬盘(SSD)也是辅助存储器的一种,也统称为外存、硬盘。

数据在磁盘和内存之间传送的速度一般是毫秒级,与内存到处理器的速度,相差10^6的数量级(百万级)。

由于HDD依然是常规数据持久化存储的首选,所以各种数据库设计优化,也更多的是基于磁盘进行考量的。所以,需要对磁盘的物理结构稍微展开一下,从而对磁盘的适用场景有更好的理解。

机械硬盘,主要由盘片、转动轴、磁头、移动臂、电机等核心组件构成。读写数据时,通过电机驱动盘片旋转,移动臂上的磁头移动到磁盘上相应的轨道上,磁头通过读取或改变这些区域的磁化方向来读写数据。

读写一个磁盘块需要3步,每一步都有相关的延迟:

磁盘控制器将磁头组合定位在磁盘块所在的磁道的柱面上所需要的时间,即为寻道时间(Seek Time);

磁盘控制器等待访问块的第一个扇区旋转到磁头下所需要的时间,即为旋转延迟(Rotational Latency);

磁盘控制器读取或者写入数据时,数据所在的扇区和扇区间的间隙经过磁头的时间,即为传输时间(Transfer Time)。

所以,磁盘的延迟 = 寻道时间 + 旋转延迟 + 传输时间

通过一个典型的例子来说明相应延迟的数据量级,一个RPM(Revolutions Per Minute)为7200的磁盘,磁头移动经过所有的磁道,大概10ms;磁盘旋转一周的时间为1/(7200/60) = 8.33ms;一个磁道上有很多块,传输时间在毫秒级以下。所以读写磁盘数据的速度主要取决于机械部分的磁头移动到正确位置的时间(寻道时间)和盘片旋转到数据位置的时间(旋转延迟)。

对比工业企业通过规模化生产的方式,从而稀释固定成本,使得边际成本递减,从而形成成本优势。磁盘操作中,寻道时间和旋转延迟时间是大头,可以看做是固定成本,传输时间是变动成本。通过将批量的随机IO操作,转换为顺序IO操作,形成规模效应,仅通过一次寻道时间+旋转延迟,完成批量的IO操作。批量顺序磁盘IO操作的场景下,磁盘的边际延迟无限趋近于传输时间,即达到毫秒级以下的延迟,大大降低磁盘数据读写延迟。

由此,导出数据库设计优化的一个根本矛盾:

CPU能直接读取操作主存中的数据,但是,数据必须持久化存储在辅助存储器(一般是磁盘)中,辅助存储器太慢了,CPU等不起。

数据库的设计与优化,重点在于弥合CPU与磁盘速度的鸿沟!

3、局部性原理

局部性原理(Principle of Locality)是计算机科学中的一个基本概念,它指出在一段时间内,程序往往倾向于访问存储器中的相邻或相关数据。这个原理是计算机系统中许多优化技术的基础,包括缓存、预取和虚拟内存管理等。

局部性原理主要包含两种类型:

时间局部性(Temporal Locality):如果一个数据项被访问,那么在不久的将来它很可能会再次被访问。例如,循环结构中的变量在每次循环迭代时都会被重复访问。

空间局部性(Spatial Locality):如果一个数据项被访问,那么与它相邻的数据项也可能会在不久的将来被访问。例如,当访问数组或连续数据结构中的一个元素时,通常会顺序访问其相邻元素。

局部性原理的应用:

缓存:CPU缓存利用时间局部性和空间局部性来存储最近使用的数据和指令,以便快速访问。

虚拟内存:操作系统使用局部性原理来管理内存页,将最近使用的页保留在内存中,而将不常用的页交换到磁盘上。

预取:硬件或软件机制会在数据被请求之前将其加载到缓存中,以利用空间局部性提高性能。

局部性原理是理解计算机系统如何优化数据访问和提高性能的关键。通过有效地利用局部性,计算机系统可以减少对慢速存储设备(如硬盘)的访问次数,从而提高整体性能。

4、数据库设计与优化的基本原则

数据库中的数据一般持久化存储在磁盘上,对数据库中数据的访问与更新操作,必然绕不开磁盘IO操作,大量的磁盘IO操作,一定会导致数据库读写性能的降低。

所以,以我个人的观点来看,数据库设计与优化有两条最基本的指导原则:

尽量减少磁盘IO的次数

必须的磁盘IO操作,尽量将随机磁盘IO转换为对磁盘的顺序IO操作,从而形成规模效应,降低数据读写的延迟。

以局部性原理为基础,可以有多种手段落实上面的两条指导原则。数据库的设计与优化实践中,始终能看到这两条指导原则的身影。

比如:

1)数据有序的在磁盘上存储,从而更好地利用空间局部性原理;

2)加载数据时,以数据页为单位,将相邻的数据记录一同预加载至内存;

3)WAL(Write Ahead Log)技术,优先写磁盘的日志缓冲区,然后顺序化IO进行日志持久化到磁盘;相邻的多个脏数据页一起flush到磁盘;

4)聚簇索引、二级索引技术等。

以MySQL中的InnoDB存储引擎为例,可以更直观的看到这种指导原则的落地实践

InnoDB存储引擎,从架构体系来看,主要包括一组后台线程/进程,以及一个/多个内存池。需要读取或者更新磁盘文件中的数据时,一般都是针对内存池进行读取或更新,更新操作,基于CheckPoint机制,实现数据、日志等批量Flush到磁盘。

5、参考文献

1、《数据库系统实现(第2版)》

2、冯诺伊曼结构[G/OL]. 维基百科, 2024(20240428)[2024-04-28].

https://zh.wikipedia.org/w/index.php?title=%E5%86%AF%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84&oldid=82425941

3、《MySQL技术内幕 InnoDB存储引擎(第2版)》

0 阅读:3