"懂mysql吧,知道CPU在读硬盘上数据的时候,是怎么解决CPU和硬盘速度不一致问题么?"
mysql会将磁盘上的数据页先加载到内存里面,然后从内存里面读数据。
INNODA
INNODB的逻辑存储结构
段:数据段,索引段。段中包含一个一个区
区: 连续页组成
页:表数据存储在不同的页空间
行:表中一条行记录,组成页
一个表中的数据可能存储在不同的页空间
缓存池
INNODB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管路。为了平衡cpu和磁盘之间的速度,使用缓存池(一块内存区域)技术来提高数据库的整体性能。首先将从磁盘读取到的页存放在缓冲池中,下次不命中就会读取磁盘上的页。
Mysql在启动的时候,会向内存申请一块连续的空间,这块空间名为Bufffer Pool
,也就是缓冲池,默认情况下Buffer Pool只有128M。
如图所示,有三部分组成:
-
ctl: 俗称控制体,里头有一个指针指向缓存页,还有一个成员变量存储着所谓的一些所谓的控制信息,例如该页所属的表空间编号、页号
-
page:缓存页,就是磁盘上的页加载进Bufffer Pool后的结构体
-
碎片:每个控制体都有一个缓存页。最后内存中会有一点点的空间不足以容纳一对控制体和缓存页,于是碎片就诞生的!
-
但是需要替换
更新数据库的内容
对于数据库中页的修改,先修改在缓冲池中的页然后再通过一定频率刷新到磁盘上,采用检查点(checkpoint)技术来实现。(与redis更新的区别??)
检查点技术
技术出现的原因?
首先缓存池的页只要修改就立即刷新到磁盘,会导致开销特别大,性能变得很差,所以刷新要按照一定频率;其次如果将页的新版本从缓存池到磁盘刷新的过程中出现宕机,数据将不能恢复。
具体实现?
采用write ahead log策略,当事务提交时,先写重做日志,再修改页。当发生宕机时,通过redo日志来完成数据的恢复,实现事务的持久性。
重做(redo)日志记录的是:对数据页的物理修改,数据文件哪些位置上的数据做了怎样的修改。redo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),