2.mysql之写磁盘操作

Posted historyofsmile

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.mysql之写磁盘操作相关的知识,希望对你有一定的参考价值。

2.mysql之写磁盘操作

mysql 是机械磁盘时代的产物,带有浓重节约空间思想(参看建表三范式内容);机械磁盘有一个问题:慢!所以数据库设计者在内存和磁盘交互的环节上,下了不少功夫。

数据页落盘

msyql 中的数据是以页(16k)为单位保存的,无论读写,都需要找到数据所在的页才行,数据在缓存池中也是以页为单位保存的。

修改一条数据时:

  • 如果数据页在缓存池(buffer pool)中,直接修改数据页
  • 如果数据页不在缓存池中,则把修改记录暂时保存在 change buffer 缓存中,等数据页被加载到内存中时修改
  • 数据落盘:mysql会在一些恰当或者必须的时机把已经被修改,但还没有写入磁盘的数据页写到磁盘中去,落盘这个操作有一些关于磁盘操作的讲究:
    • 把多次修改的结果一次写入磁盘——减少写磁盘次数;
    • 一个数据页落盘时,会尽量把和它位置邻近的数据页一并落盘(这个操作让人又爱又恨)——把磁盘的随机操作变成顺序操作。

redo log

是什么和为什么

前边我们说了修改操作的大概流程,对于那些存在change buffer 中的数据,如果数据页一直不被读取,就一直放在内存中吗?
内存有个特性:掉电没,内存中的数据脏页如果丢了怎么办?最好的办法就是及时落盘,保存在磁盘中才最安全,但这一点又和不频繁、随机操作磁盘的宗旨相违背,这种既要便宜又要好的无理要求,只能整点科技了!
innoDB引擎引入了WAL(Write-Ahead Logging)技术,就是先写日志,日志记好了再考虑数据怎么真实落盘的问题,即便数据没有落盘成功就丢失了,咱还有log——这就是redo log(重做日志)。

写磁盘的随机性和频率

redo log 的引入的原因已经交代了,就是防止缓存中的数据脏页丢失;缓存中存这么多数据脏页的原因是为了不频繁地随机写磁盘;
那redo log 要不要写磁盘,会不会频繁随机写盘?其实redo log 本身就是一个顺序读写的文件,随机写的可能性没有了,至于写磁盘的频率,咱也可以设置,比如:本来要一直开着水仓的盖子,让水管里的水流进去,但是为了防止有东西掉进去,咱先把水放桶里,等桶满了,再打开水仓盖子,把水倒进去——这个水桶就是 log buffer,innoDB引擎中,这个水桶可以不要,也可以要,也可以调整大小——这样就解决了些磁盘的频率问题。

原理决定了它的特性

redo log 本身是一个固定大小的文件,虽然可以设置,但是容量终归不会太大,如果装满了,那只能把整个系统暂时锁起来,根据redo log 完成数据页落盘,然后清理掉这些没用的redo log。
正是因为这个原理,redo log 不可能像binlog一样记录数据的逻辑日志(对原数据做了什么样的操作),而只能是物理日志(原数据被改成了什么)。因为逻辑日志总需要从头一步一步才能推出现在的数据,而redo log 就是一个循环文件,边写边删。

以上是关于2.mysql之写磁盘操作的主要内容,如果未能解决你的问题,请参考以下文章

什么是数据库的 “缓存池” ?(万字干货)

(0.2.1)mysql数据库环境-操作系统配置

redis 作为 mysql的缓存

使用redis做为MySQL的缓存

MySQL缓存策略详解

mysql和redis的区别