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 中的相关操作,然后返回查询结果。只有查询数据时,才需要将数据读磁盘到内存

  • 相关阅读:
    算法题-数组算法题
    Linux-shell脚本的调试和追踪
    Linux-循环loop
    Linux-条件判断式
    Linux-第一行#!/bin/bash的含义
    Linux-排序命令:sort、wc、uniq
    Linux-选取命令:cut grep
    Linux-shell变量
    Linux-重定向、追加、tee
    Linux三剑客-sed编辑文本
  • 原文地址:https://www.cnblogs.com/virgosnail/p/10454150.html
Copyright © 2011-2022 走看看