数据库Mysql

"懂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),

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值