zoukankan      html  css  js  c++  java
  • MySQL:change buffer

    1. 概念

      Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中。其大小通过参数 innodb_buffer_pool_size 控制;

      change buffer 是 buffer pool 中的一部分内存;它既在内存中有拷贝,也可以持久化到磁盘;其大小通过参数 innodb_change_buffer_max_size 控制,表示最多占用 buffer pool的百分比;

      当需要更新一个数据页时,如果数据页在内存中,则直接更新;否则,在不影响数据一致性的前提下,InnoDB 将这些操作缓存在 change buffer 中,这样就不必从磁盘中读取数据,当下次查询需要访问这个数据页时,再将数据页读入内存,然后执行 change  buffer 中与这个页有关的操作,最后将查询结果返回。

      merge:将  change  buffer 的操作应用到数据页的过程称为 merge。除了访问数据页会触发 merge 外;系统后台有线程会定期 merge;数据库正常关闭的过程中也会触发 merge 操作。

      更新操作记录到 change  buffer ,可以减少读磁盘,提高执行效率;而且读入数据会占用 buffer pool ,还可以提高内存使用率。

    2. 使用条件

      对于唯一索引,所有更新操作都需要做唯一性约束的判断,必须将数据页读入内存,直接在内存中更新,不使用 change  buffer 。

      对于普通索引,当数据页在内存中时,直接进行更新操作即可;当数据页不在内存中时,直接将更新操作写入 change buffer 即可。

    3. 使用场景

      change buffer 的主要作用就是将记录的变更操作缓存下来,在 merge 之前, change buffer 记录的越多,收益就越大。

      适合页面变更完之后被马上访问概率较小的场景。

      如果页面变更之后又要被访问,此时会立即触发 merge 过程,这样反而增加了 change buffer 的维护代价,多了一个写 change buffer 的操作,此时关闭 change buffer 反而能提高效率;

    4. changer buffer 和 redo log

      change buffer 主要节省的是随机读磁盘的IO 消耗;

      redo log 主要是节省随机写磁盘的IO消耗;

      更新普通索引时:

        如果数据不在内存中,可以直接将变更操作缓存到 change buffer,而不需要将数据读入内存;如果没有 change buffer,则必须将数据读入内存,然后更新数据。此时节省了随机读磁盘的IO消耗;

        redo log 将数据变更操作记录在日志中,不用写入磁盘即可返回执行结果;如果没有 redo log,则更新完数据必须先将数据写入磁盘,再返回执行结果。此时节省了随机写磁盘的IO消耗;

      查询普通索引时:

        如果数据不在内存中,必须先将数据读入磁盘,再执行 change buffer 中的相关操作,然后返回查询结果。只有查询数据时,才需要将数据读磁盘到内存

  • 相关阅读:
    jQuery中$.each()方法的使用
    点击分享功能
    localStorage使用总结
    核桃说笔记2
    php 微信模板消息发送
    报错:SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated UXXXXXXXX escape
    报错:Cannot remove entries from nonexistent file c:program filesanaconda3libsite-packageseasy-install.pth
    Pycharm如何修改背景图(BackgroundColor)
    git 设置 .gitignore 为全局global + 配置.gitignore为全局后不生效解决办法
    Windows Server 2016 下执行定时任务(英文系统)
  • 原文地址:https://www.cnblogs.com/virgosnail/p/10454150.html
Copyright © 2011-2022 走看看