缓冲池、顺序读取与随机读取

根据存储介质的不同,可以将数据库分为基于磁盘的数据库系统、基于内存的数据库系统,以及混合型数据库系统。基于磁盘的数据库系统(disk-base database)是最为常见的一种关系型数据库,比如MySQL、Oracle、SQL Server、DB2数据库。随着内存容量的不断增加,基于内存的数据库系统(in-memory database)也变得十分流行,MySQL NDB Cluster,Oracle Ten Times等数据库厂商都提供了内存关系型数据库系统。而混合型数据库系统(hybrid database)将上述两种数据库的优点进行了结合。

毫无疑问,基于内存的数据库系统是最快的,因为数据库不需要对磁盘进行操作。磁盘的速度要远慢于内存的速度,因此基于磁盘的数据库系统一般都有缓冲池,即一块内存区域,其作用是将从磁盘上读取的指定大小数据—称为页(或块),放入缓冲池。当再次读取时,数据库首先判断该页是否在缓冲池中,如果在则直接读取缓冲池中的页,如果不在则读取磁盘上的页。对于写操作,数据库将页读入缓冲池,然后在缓冲池中对页进行修改,修改完成后的页一般被异步地写入磁盘上。对于缓冲池的维护一般采用最近最少使用(Least Recently Used,LRU)算法。由此可见,缓冲池的大小决定了数据库的性能。若数据库中的数据可以完全存放于缓冲池中,则可以认为这时数据库的性能是最优的。除了同步/异步的写磁盘操作外,所有其他操作都可以在内存中完成。

对于MySQL数据库系统,由于其有着各种不同的存储引擎,因此其缓冲池是基于存储引擎的,也就是说每个存储引擎都有自己的缓冲池。对于MyISAM存储引擎来说,变量key_buffer_size决定了缓冲池的大小。对于InnoDB存储引擎来说,变量innodb_buffer_pool_size决定了缓冲池的大小。图9-1是Percona公司CTOVadim对缓冲池所做的性能测试。

在这里插入图片描述
图9-1中的A点表示此时缓冲池为20GB,数据库的数据全部被缓存在缓冲池中,这时数据库的性能是最优的,测试的结果为2500TPS(transaction per second)。因为数据已经全部被缓存,继续增大缓冲池为22GB并不会对性能有多大的提升。B点表示缓冲池的大小为18 GB,此时只有一小部分的数据不能被缓存,测试的结果为900TPS。可见缓冲池大小减少了10%,性能却下降了164%。C点表示缓冲池的大小为6GB,只能缓存30%的数据,这时数据库的性能更差,测试结果为130TPS。

在现实的生产环境中,在大多数情况下经过线上的一段运行时间后,数据库的大小通常都会大于内存的大小。例如数据库的大小是500GB,而服务器的内存可能只有96GB或者128GB。这种情况非常正常,一般来说,对于500GB的数据库,热点的数据可能是小部分的,具体占据多大的比重,这取决于具体的应用。

在生产环境中缓冲池的大小小于数据文件的大小,因此不可避免地存在磁盘的读取操作。但是传统的机械硬盘的特性决定了顺序读取要远快于离散读取。图9-2显示了传统机械硬盘的构造。

在这里插入图片描述
传统机械硬盘由磁头(head)、磁道(track)、扇区(sector)、柱面(cylinder)组成。读取时需要通过磁头的移动来定位数据,这个时间称为寻道时间(seek time)。目前,一块15000转SAS传统的机械硬盘的平均寻道时间为2.58ms。需要注意的是,这指的是平均时间。根据平均寻道时间,可以大致估算IOPS(IO per second),即1000/2.58 = 380 IOPS,而在实际情况下单块磁盘的IOPS一般为150左右。如果数据都是顺序存放的,显然寻道时间会快很多,这时的寻道时间一般只需0.14ms。可见,比平均寻道时间提高了18倍。

在介绍完上述内容后,可以给出顺序读取、随机读取的定义。顺序读取(sequntialread)是指顺序地读取磁盘上的页。随机读取(random read)是指访问的页不是连续的,需要磁盘的磁头不断移动。这里需要注意的是,这里的“顺序”指的是逻辑上的顺序,在物理上不可能保证所有的数据都是顺序的。而为了保证顺序,数据库存储引擎一般都根据区(extent)来管理页,例如在InnoDB存储引擎中1个区是连续的64个页。因此在顺序读取数据库时,可以保证这64个页是连续的,而区与区之间的页,可能是连续的也可能是不连续的。

固态硬盘是近几年出现的一种新的存储设备,其内部由闪存(flash memory)组成。因为具有低延迟性、低功耗、轻量,以及防震性,闪存设备已在移动设备上得到了广泛的应用。而企业级的生产应用使用固态硬盘,同时通过并联多块闪存来进一步提高数据传送的吞吐量。

图9-3显示了一个双通道的固态硬盘架构,通过支持4路的闪存交叉存储来降低固态硬盘的访问延时,同时增大并发的读写操作。而通过进一步增加通道的数量,固态硬盘的性能可以有线性的提高,例如常见的Intel SSD X-25M就是10通道的固态硬盘。
在这里插入图片描述

因为闪存是一个完全的电子设备,没有任何的读写磁头等移动部件,因此固态硬盘有着较低的访问延时。当主机发布一个读写请求时,固态硬盘的控制器会把I/O命令从逻辑地址映射到实际的物理地址,写操作还需要修改相应的映射表信息。算上这些额外的开销,固态硬盘的访问延时一般小于0.1 ms左右,随机读取可达4000IOPS甚至更高。即使是固态硬盘,顺序读取还是要快于随机读取。因此对于固态硬盘的优化需要不同于传统机械硬盘的思考,但是这更多的是数据库存储引擎内部需要考虑的问题。

总结

  • 缓冲池的大小决定数据库的性能
  • 顺序读取比随机读取快
  • 缓冲池的维护采用LRU算法
  • 缓冲池的实现与引擎相关
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值