MySQL45讲之更新缓存

本文介绍 MySQL的更新缓存 Change Buffer,以及唯一索引和普通索引如何选择。

唯一索引和普通索引的选择

查询过程

在唯一索引下,查询索引树,找到第一个匹配的行并返回

[En]

Under the unique index, query the index tree, find the first matching row and return

在普通索引下,查询索引树,找到第一个匹配的行,然后继续遍历直到第一个不匹配的行,然后返回。

[En]

Under a normal index, query the index tree, find the first matching row, and then continue to traverse until the first mismatched row, and then return.

即使匹配的行跨了数据页,但一个数据页默认 16KB,每行只存储一个 key且是整数,可以存储近千个。那么普通索引下,最多也是多加载一次数据页。所以唯一索引和普通索引的查询效率基本相同。

更新过程

首先介绍下 MySQL的更新缓存 Change Buffer,它使用的是 MySQL Buffer Pool的存储空间,可以设置 Change BufferBuffer Pool中的占比, MySQL5.6默认为 25%,最多可以开到 50%

顾名思义, Change Buffer就是用来存储更新操作的,使得更新操作不需要加载对应的数据页,直接更新到内存。当对 Change Buffer中的行进行查询时,就会将原始数据页加载到内存,并将缓存应用到原始数据页,这个就是 merge过程。 Change Buffermerge触发时机:

  • 当原始数据页加载到 Buffer Pool
  • 后台线程定期 merge
  • 数据库正常关闭时

Change Buffer的刷盘触发时机:

  • 数据库空闲时,会定期持久化。
    [En]

    when the database is idle, it will be persisted regularly.*

  • 数据库缓冲不够用时
  • 数据库正常关闭之前
  • redo log写满时

你或许会疑问”万一在刷盘之前数据库宕机了,那之前的更新不就丢失了么?”

答案是否。简单分析是,因为将更新操作写到 Change Buffer后,还会将更新操作写到 redo log并持久化到磁盘,数据库宕机重启之后,会将之前的更新缓存数据恢复到内存。

具体分析如下:
(1) change buffer写入, redo log虽然做了 fsync但未 commit, binlogfsync到磁盘,这部分数据丢失

(2) change buffer写入, redo log写入但没有 commit, binlog以及 fsync到磁盘,先从 binlog恢复 redo log,再从 redo log恢复 change buffer

(3) change buffer写入, redo logbinlog都已经 fsync.那么直接从 redo log里恢复。

接下来,分析这两个索引下的更新操作:

[En]

Next, analyze the update operations under the two indexes:

在唯一索引下,查询索引树,将对应的数据页加载到内存中,判断是否违反一致性约束,然后更新

[En]

Under the unique index, query the index tree, load the corresponding data page into memory, determine whether the consistency constraint is violated, and then update

普通索引,查询索引树,直接更新内存中的 Change Buffer

因为唯一索引需要判断更新操作是否违反一致性约束,所以必须加载数据页,也就用不到 Change Buffer ,即 Change Buffer 只用于普通索引。

从上面的分析可见,在更新多于读取操作的情况下,普通索引的更新操作效率要高于唯一索引。但如果是更新之后就有查询的场景,那么 Change Buffer不但没有起到提效作用,反而占用的缓冲空间。所以,这种情况下,一般会关闭 Change Buffer来避免它的副作用。

总结来说,如果业务需要数据库来对数据进行唯一性约束,那么优先还是考虑唯一索引;否则,如果是更新远多于读取操作的业务场景,比如归档,日志等,考虑用普通索引代替唯一索引,可以提高内存命中率和提高更新效率。但如果是更新之后就有查询的场景,则建议关闭 Change Buffer,来避免它的副作用。

Original: https://www.cnblogs.com/flowers-bloom/p/mysql45-change-buffer.html
Author: flowers-bloom
Title: MySQL45讲之更新缓存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508173/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 贪心算法原理及其应用

    概述 贪心算法应该算是那种”只闻其声不见其人”的算法,我们可能在好多地方都会听到贪心算法这一概念,并且它的算法思想也比较简单就是说算法只保证局部最优,进而达…

    数据库 2023年6月11日
    0150
  • Installing Superset最新版本安装(笔记)

    官方文档:https://superset.apache.org/docs/installation/installing-superset-from-scratch 由于在cen…

    数据库 2023年6月14日
    0107
  • leetcode 101. Symmetric Tree 对称二叉树(简单)

    一、题目大意 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root = [1,2,2,3,4,4,3]输出:true 示例 2: 输入:root =…

    数据库 2023年6月16日
    087
  • 最全面的MySQL数据库讲解,老杜带你从基础入门mysql

    Original: https://www.cnblogs.com/chaichaichai/p/15624323.htmlAuthor: 牛仔码农Title: 最全面的MySQL…

    数据库 2023年5月24日
    091
  • 异常详解

    🦔异常 发现错误的理想时机是在编译阶段,也就是在运行程序之前。然而编译期间并不能找到所有的错误,余下的问题必须在运行期间解决。这就需要错误源能够通过某种方式,把适当的信息传递给某个…

    数据库 2023年6月14日
    094
  • JWT简介

    JWT简介 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制。 (1) 什…

    数据库 2023年6月14日
    0109
  • postman结合newman生成测试报告

    1. cmd窗口安装newman npm install -g newman 2. cmd窗口安装newman-html报告 nnpm install -g newman-repo…

    数据库 2023年6月14日
    0104
  • 绿色安装MySQL5.7版本—-配置my.ini文件注意事项

    简述绿色安装MySQL5.7版本以及配置my.ini文件注意事项 前言 由于前段时间电脑重装,虽然很多软件不在C盘,但是由于很多注册表以及关联文件被删除,很多软件还需要重新配置甚至…

    数据库 2023年5月24日
    0102
  • mysql @rownum := @rownum+1 方式获取行号

    MySQL: mysql中没有获取行号的函数,因此需要通过一些自定义语句来进行获取。通常做法是,通过定义用户变量@rownum来保存表中的数据。通过赋值语句@rownum:=@ro…

    数据库 2023年6月16日
    082
  • Redis缓存相关的几个问题

    1 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来…

    数据库 2023年6月14日
    077
  • LIMIT和OFFSET分页性能差!今天来介绍如何高性能分页

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 前言 之前的大多数人分页采用的都…

    数据库 2023年6月11日
    0130
  • MySQL知识点大全!!

    使用PreStatement对象: public int execUpdate(String sql, Object[] parms) { int count = 0; try {…

    数据库 2023年6月16日
    093
  • MySQL45讲之保证高可用

    本文主要介绍 MySQL 主备延迟,延迟产生的原因和主备切换策略。 主备延迟 主备同步过程中主要有三个时间点: [En] There are three main time poi…

    数据库 2023年5月24日
    075
  • 设计模式六大原则(简单总结)

    一、单一职责原则 通俗来说即一个类只负责一项职责(实现类要职责单一),可以降低类的复杂度,提高系统的可读性、可维护性,降低类修改时对其他功能的影响 二、里氏替换原则 即子类继承父类…

    数据库 2023年6月6日
    065
  • Go编译过程

    一、 Go编译流程 二、过程说明 词法解析 读取Go源文件,将字符序列转换为符号(token)序列,比如将”:=”转换为_Define 代码中的标识符、关键…

    数据库 2023年6月14日
    082
  • JavaWeb连接MySQL数据库

    JavaWeb连接MySQL数据库 JavaWeb连接MySQL数据库的方式有很多,首先我们讲解JDBC的配置方法 一、JDBC的配置方法 1、什么是JDBC 什么是JDBC嘞?J…

    数据库 2023年5月24日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球