MySQL进阶

2023-10-27

无知的我正在复习MySQL进阶知识。。。。

笔记特点是 我重新整理了涉及资料的一些语言描述、排版,而使用了自己比较容易理解的描述、同样是回答了一些常见关键问题

如果有遇到有任何无法进展问题或者疑惑的地方,应该在讨论区留言 或者 其他途径以寻求及时的帮助,以加快学习效率 或者 培养独立解决问题的能力、扫清盲点、补充细节

逻辑存储结构

image-20220505195651106

表空间是 InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd)

在行中 默认有两个隐藏字段 它们的作用是

Trx_id(最后一次操作事务的id):保存事务id。每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。

Roll_pointer(列指针):保存修改前的信息。每次对某条引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

架构 概述

下面是InnoDB架构图,左侧为内存结构,右侧为磁盘结构

image-20220505201045343

架构 内存结构

内存结构分为四大块 uffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer

缓冲池

image-20220505201605740

缓冲池 意义

为了避免每次访问都磁盘I/O,而是对经常使用的数据,加载到缓冲池中 并 访问。

缓冲池 内部数据

不仅缓存了索引页和数据页,还包含了undo页、插入缓存、自适应哈希索引以及InnoDB的锁信息等等。

缓冲池 运行机制

在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度。

缓冲池 以Page页为单位 并 分为以下三类

free page:空闲page,未被使用。

clean page:被使用page,数据没有被修改过。

dirty page:脏页,被使用page,数据被修改过,但是没有同步到磁盘中,导致二者存储的数据不一致

更改缓冲区

Change Buffer

image-20220505202459740

更改缓冲区 机制

在执行DML语句时,如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘,而会将数据暂时存储在缓冲区 Change Buffer中,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中。(它的操作只作用于 二级索引页)

更改缓冲区 意义

为了解决 删除和更新可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘IO,导致磁盘消耗过大的问题。这是因为与聚集索引不同,二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引,如下图。

image-20220505203752577

自适应hash索引

Adaptive Hash Index

自适应hash索引 意义

用于优化对Buffer Pool数据的查询。这是因为hash索引在进行等值匹配时(不做范围查询、模糊匹配等),一般性能是要高于B+树的,因为hash索引一般只需要一次IO即可,而B+树,可能需要几次匹配,所以hash索引的效率要高

自适应hash索引 机制

InnoDB存储引擎会监控对表上各索引页的查询,如果观察到在特定的条件下hash索引可以提升速度,则建立hash索引(可以通过这个参数选择是否开启:adaptive_hash_index)

日志缓冲区

Log Buffer

日志缓冲区 机制

如果需要更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘 I/O。这是因为它是用来保存要写入到磁盘中的log日志数据(redo log 、undo log),日志缓冲区的日志会定期刷新到磁盘中。(默认大小为 16MB)

日志缓冲区 参数

innodb_log_buffer_size(缓冲区大小)

innodb_flush_log_at_trx_commit(日志刷新到磁盘时机)取值主要包含以下三个

1: 日志在每次事务提交时写入并刷新到磁盘,默认值。

0: 每秒将日志写入并刷新到磁盘一次。

2: 日志在每次事务提交后写入,并每秒刷新到磁盘一次。

image-20220505204702304

架构 磁盘结构

image-20220505211416307

System Tablespace 查看存放的位置参数:innodb_data_file_path

image-20220505211459908

系统表空间,默认的文件名叫 ibdata1。

File-Per-Table Tablespaces 开关参数:innodb_file_per_table(默认开启)

image-20220505211550352

每创建一个表,都会产生一个表空间文件。如图

image-20220505211627870

image-20220505211944921

General Tablespaces 创建通用表空间参数 :CREATE TABLESPACE

A. 创建表空间
CREATE TABLESPACE ts_name ADD DATAFILE 'file_name' ENGINE = engine_name;
B. 创建表时指定表空间
CREATE TABLE xxx ... TABLESPACE ts_name;

image-20220505212122366

后台线程

后台线程 意义

内存中我们所更新的数据,又是如何到磁盘中的呢? 此时,就涉及到一组后台线程

image-20220505212443976

在InnoDB的后台线程中,分为4类

Master Thread 、IO Thread、Purge Thread、Page Cleaner Thread。

1). Master Thread

  • 核心后台线程,负责调度其他线程
  • 负责将缓冲池中的数据异步刷新到磁盘中, 保持数据的一致性
  • 脏页的刷新、合并插入缓存、undo页的回收 。

2). IO Thread

在InnoDB存储引擎中大量使用了AIO来处理IO请求, 这样可以极大地提高数据库的性能,而IOThread主要负责这些IO请求的回调。

IO线程的类型

image-20220505212746217

查看InnoDB的状态信息,其中就包含IO Thread信息
show engine innodb status \G;

image-20220505212805422

@0代表线程在等待接收请求

@aio代表异步非阻塞io

3)Purge Thread

主要用于回收事务已经提交了的undo log。在事务提交之后,undo log可能不用了,就用它来回收。

4)Page Cleaner Thread

协助 Master Thread 刷新脏页到磁盘的线程。从而可以减轻 Master Thread 的工作压力,从而减少阻塞。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL进阶 的相关文章

随机推荐

  • Unity3D实战【八】Animator 动画控制器

    一 创建文件夹Prefabs 存放预制体 和Animations 存放动画相关 给人物改个名字 Player Add Component gt Animator 把人物拖到Prefabs文件夹里 在Animations文件夹下建一个文件夹A
  • 随机生成验证码(Java实现)

    需求 定义方法实现随机产生一个5位的验证码 每位可能是数字 大写字母 小写字母 分析 定义一个方法 生成验证码返回 方法参数是位数 方法的返回值类型是String 在方法内部使用for循环生成指定位数的随机字符 并连接起来 把连接好的随机字
  • 选项式api V/S 组合式api

    Options 选项式api 特点 多个选项的对象来描述组件的逻辑 例如data选项写数据 methods选项写函数 一个功能逻辑的代码分散 选项所定义的属性都会暴露在函数内部的 this 上 它会指向当前的组件实例 优点 易于学习和使用
  • selenium的安装和下载谷歌浏览器镜像驱动

    selenium安装 Selenium是一个用于web自动化测试的框架 在使用Ajax请求数据的页面中 会出现 sign token等密钥 如果考虑去破解可能花费的精力较多 所以考虑借助使用Selenium框架来实现数据爬取 如果没安装se
  • tensorflow学习率控制及调试

    在深度学习中 学习率变化对模型收敛的结果影响很大 因此很多时候都需要控制学习率的变化 本文以tensorflow实现learning rate test为例 讲述学习率变化控制的方法 以及怎么调试 一 learning rate test
  • ThreadLocal使用

    1 简介 ThreadLocal类用来提供线程内部的局部变量 不同的线程之间不会相互干扰 这种变量在多线程环境下访问 通过get和set方法访问 时能保证各个线程的变量相对独立于其他线程内的变量 在线程的生命周期内起作用 可以减少同一个线程
  • HCIA/HCIP使用eNSP模拟OSPF综合应用场景(虚链路 特殊区域 认证 引入外部路由)

    OSPF综合应用场景 配套实验拓扑 OSPF Comprehensive Application Experiment topo 目录 OSPF综合应用场景 拓扑预览 一 基础配置 1 配置R1 2 配置R2 3 配置R3 4 配置R4 5
  • asp.net ajax 参数,ASP.NET jquery ajax传递参数

    第一种 GET传递 前台 ajax GET 传递 即在请求的地址后面加上参数 URL地址长度有显示 安全性低 后台接收 Request QueryString 参数名字 例如 function LoadBar id var project
  • 烂大街的TCP/IP网络模型,你真的懂了?

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 一 面试真题 二 面试官心理分析 三 面试题剖析 一 面试真题 你能聊聊TCP IP 的四层网络模型和 OSI 七层网络模型吗 二 面试官心理分析 为啥要问这个
  • 微信支付二维码native原生支付开发模式一

    开发前 商户必须在公众平台后台设置支付回调URL URL实现的功能 接收用户扫码后微信支付系统回调的productid和openid URL设置详见回调地址设置 1 业务流程时序图 图6 8 原生支付接口模式一时序图 业务流程说明 1 商户
  • 关于JAVA 并发类的Executor误用导致的线程数量异常

    近期在项目中 在方法中局部使用 Executor创建固定线程 没有按照要求在局部用完之后进行shutdown操作 导致每次方法调用都会生成一个线程池 由于固定线程池在生成线程之后 不会自动回收 一致处于 run 状态等待任务的到达 因此导致
  • Qt Creator 无效构建套件(Kits)的清除以及恢复默认设置

    Qt Creator 无效构建套件 Kits 的清除以及恢复默认设置 在使用在Qt Creator 开发过程中 有时候由于配置的原因出现了很多无效的构建套件 Kits 在创建项目也会列出来 因此想清理掉这些的无效的Kit 再有就是将Qt的配
  • Serializable接口解读

    Serializable 接口 作为 Java 中那些绕不开的内置接口 Serializable这个接口的全限定名 包名 接口名 是 java io Serializable 这里给大家说个小技巧 当你看到一个类或者接口的包名前缀里包含ja
  • Eclipse如何打开debug变量窗口

    今天笔者在使用Eclipse调试的时候 发现没有变量 Variables 监视窗口 真是头痛得很 最后摸索出一套显示变量窗口的操作如下 点击other 找到Variables并点击 最后调试代码 调试后如图所示 点击Java 最后可以显示出
  • WDK获得U盘的序列号

    一 获得U盘的逻辑序列号 重点函数 FltQueryVolumeInformation 查询卷实例的信息 可查询的类型如下 typedef enum FSINFOCLASS FileFsVolumeInformation 1 FileFsL
  • 老板现在喊我大哥,原因是我用阿里分布式事务框架Seata解决了长久以来困扰公司的分布式事务问题

    大家好 我是曹尼玛 从大学毕业5年 一直努力学习 努力工作 追求新技术 不保守 上个月我来到一家新公司上班 月薪20K 这家公司老板人很好 对员工很关爱 公司氛围不错 同事们也努力把公司项目搞搞好 除了那个混日子的10年开发经验的老王 老板
  • virtual memory exhausted: Cannot allocate memory

    编译llvm的时候出现了这个问题 原因是用了太多线程去编译 内存不够了 把 make j 改成 make j32
  • 小白简易安装MySQL数据库

    安装MySQL 一 下载地址 注意 请下载zip版 尽量不要下载exe版 方便后续卸载 https cdn mysql com Downloads MySQL 5 7 mysql 5 7 29 winx64 zip 二 操作步骤 下载后解压
  • css3 --- 实现动画线条运动效果实例集合

    CSS3实现动画线条运动效果实例集合 一 laoyuan 2016 12 20 标签 css3 阅读 5 157 在我们日常的开发中 有时候有的图片 布局块需要加一下边框运动效果 对于这些效果 我们可以使用CSS3动画属性animation
  • MySQL进阶

    无知的我正在复习MySQL进阶知识 笔记特点是 我重新整理了涉及资料的一些语言描述 排版 而使用了自己比较容易理解的描述 同样是回答了一些常见关键问题 如果有遇到有任何无法进展问题或者疑惑的地方 应该在讨论区留言 或者 其他途径以寻求及时的