近一年的攻击趋势研究
传统 LRU 淘汰法 缓冲池是基于传统的 LRU 方法来进行缓存页管理的,我们先来看下如果使用 LRU 是如何管理的。 LRU,全称是 Least Recently Used,中文名字叫作「最近最少使用」。从名字上就很容易理解了。 这里分两种情况: (1)缓存页已在缓冲池中 这种情况下会将对应的缓存页放到 LRU 链表的头部,无需从磁盘再进行读取,也无需淘汰其它缓存页。
如下图所示,如果要访问的数据在 6 号页中,则将 6 号页放到链表头部即可,这种情况下没有缓存页被淘汰。 缓冲池的空间管理 你可能会有疑问,缓冲池这么洋气的东西,为什么不把所有的数据都放到缓冲池里呢?这样速度岂不是美滋滋,放到磁盘里慢的跟老牛拉车一样。 哎,哥,醒醒,抛开内存的易失性不谈,缓冲池也是有大小限制的。那你可能又有疑惑了,既然缓冲池有大小限制,那我每次都读入的数据页怎么来管理呢。别的数据页都占了地儿了,哪有我的位置?
这里我们来聊聊缓冲池的空间管理,其实对缓冲池进行管理的关键部分是如何安排进池的数据并且按照一定的策略淘汰池中的数据,保证池中的数据不“溢出”,同时还能保证常用数据留在池子中。 缓冲池的应用 缓冲池你也了解了,可能此时你最关注的是它在 SQL 执行时起了一个什么样的作用。上篇文章中我们简单的提到过一条 SQL 语句的执行过程,但并未涉及到缓冲池相关的问题。这期我们仍是以一条 SQL 来作为切入点。 当一条 SQL 执行的时候,如果是读操作,要查找的数据所在的数据页在内存中时,则将结果返回。否则会把对应的数据页加载到内存中,然后再返回结果。 同样对于写操作来说。如果要修改的行所在的数据页在内存中,则修改后返回对应的结果(当然还有后续操作)。如果不在的话,则会从磁盘里将该行所对应的数据页读到内存中再进行修改。 好了,现在让我们回到开始时候的问题。为什么操作磁盘慢,但是 SQL 执行却不慢呢。到这里相信你也差不多知道了吧。 缓冲池的存在,很大程度减少了磁盘 I/O 带来的开销。要操作的数据行所在的数据页如果存在于缓存中的话,就不需要从磁盘中进行读取。这样在执行后就可以很快拿到结果。 缓冲池的预读机制 我们可以看出来,只要不存在或减少磁盘 I/O,执行速度自然就会变快。那么对于加载数据页这种无法避免的磁盘 I/O 来说是否有更好的方式呢?既然避免不了,那减少磁盘 I/O 的次数总可以吧? 这就是我们要讲的 Mysql 中「预读」的新特性,它是 Innodb 通过在缓冲池中提前读取多个数据页来优化 I/O 的一种方式。因为磁盘读写的时候,是按照页的方式来读取的(你可以理解为固定大小的数据,例如一页数据为 16K),每次至少读入一页的数据,如果下次读取的数据就在页中,就不用再去磁盘上读取了,从而减少了磁盘 I/O。
可以在命令行通过如下命令查看对应的页大小: (编辑:莆田站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |