MySQL 体系结构

2023-11-18

一、物理文件

  1. 参数文件 
    告诉Mysql实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内存结构的大小等设置。用文件存储,可编辑,若启动时加载不到则不能成功启动(与其他数据库不同)。参数有动态和静态之分,静态相当于只读,动态是可以set的。如我们通过show variable like '***'查出来的key、value值,是可以通过set key=value直接修改的。同是,修改时还有作用域之分,即这个seesion个有效和全局有效,在对应的key前加上session或global即可,如select @@seesion。read_buffer_size、set @@global。read_buffer_size。
  2. log file     
    用来记录Mysql实例对某种条件做出响应时写入的文件。如错误日志文件、二进制日志文件、慢查询日志文件、查询日志文件等。 
    • error log
      通过show variables like 'log_error'来查看错误日志存放地址
    • slow log
      通过show variables like '%long%' 查看慢查询日志记录的阈值,新版本设成了0.05;通过show variables like 'log_slow_queries'查看是否开启了,默认为关闭的;通过show variabes like 'log_queries_not_using_indexes'查看是将没有使用索引的查询记录到慢日志中。mysql中可以直接通过mysqldumpslow命令来查看慢日志。
    • general log
      记录所有数据库操作记录,平时不建议打开
    • bin log
      不记录查询,只记录对数据库所有的修改操作。目的是为了恢复(point-in-time修复)和复制。通过show variables like 'datadir'查看存放路径。二进制日志支持STATEMENT、ROW、MIX三种格式,通过binlog_format参数设定,通常设置为ROW,可以为数据库的恢复和复制带来更好的可靠性,但会带来二进制文件大小的增加,复制时会增加网络开销。mysql中通过mysqlbinlog查看二进制日志文件内容。
  3. socket 文件 
    当用Unix域套接字方式进行连接时需要的文件。
  4. pid文件 
    Mysql实例的进程ID文件。
  5. 表结构定义文件 
    用来存放Mysql表结构定义文件。因为Mysql插件式存储引擎的体系结构,每个表都有一个对应的文件,以frm后缀结尾。 
  6. 存储引擎文件 
    存储自己的文件来保存各种数据,真正存储了数据和索引等数据。下面主要介绍InnoDB的存储引擎下的表空间文件和重做日志文件。 
    • 表空间文件 
      InnoDB默认的表空间文件为ibdata1,可通过show variables like 'innodb_file_per_table'查看每个表是否产生单独的。idb表空间文件。但是,单独的表空间文件仅存储该表的数据、索引和插入缓冲等信息,其余信息还是存放在默认的表空间中。 
    • redo log file 
      实例和介质失败,重做日志文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用重做日志恢复到掉电前的时刻,以此来保证数据的完整性。参数innodb_log_file_size指定了重做日志文件的大小;innodb_log_file_in_group指定了日志文件组中重做日志文件的数量,默认为2,innodb_mirrored_log_groups指定了日志镜像文件组的数量,默认为1,代表只有一个日志文件组,没有镜像;innodb_log_group_home_dir指定了日志文件组所在路径,默认在数据库路径下。 
    • archive redo log

二进制日志和重做日志的区别:首先,二进制日志会记录所有与Mysql有关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。而InnoDB存储引擎重做日志只存储有关其本身的事务日志;其次内容不同,不管将二进制日志文件记录的格式设为STATEMENT还是ROW,又或者是MIXED,其记录的都是关于一个事务的具体操作内容。而InnoDB存储引擎的重做日志文件记录的关于每个页的更改的物理情况 。此外,写入时间不同,二进制日志文件是在事务提交前进行记录的,而在事务进行的过程中,不断有重做日志条目被 写入重做日志文件中。 

二、线程

  1. Master Thread 
    负责刷新缓存数据到磁盘并协调调度其它后台进程。Master thread线程的优先级最高,内部主要是4个循环loop组成:主循环、后台循环、刷新循环、暂停循环。
    • 主循环
      • loop主循环每秒一次的操作
        • 日志缓冲刷新到磁盘,即使这个事务还没有提交。(总是执行,所以再大的事务commit 的时间也是很快的) 
        • 合并插入缓冲(innodb当前一秒发生的io次数小于5次则执行)
        • 至多刷新100个innodb的缓冲池中的脏页到磁盘(超过配置的脏页所占缓冲池比例则执行,在配置文件中由innodb_max_dirty_pages_pac决定,默认是90,新版本是75,google建议是80)
        • 如果当前没用用户活动,切换到backgroud loop
      • loop主循环每10秒一次的操作
        • 刷新100个脏页到磁盘(过去10秒IO操作小于200次则执行)
        • 合并至多5个插入缓冲(总是)
        • 将日志缓冲到磁盘(总是)
        • 删除无用的Undo页(总是)
        • 刷新100个或者10个脏页到磁盘(有超过70%的脏页,刷新100个脏页;否则刷新10个脏页)
        • 产生一个检查点
    • 后台循环
      • 删除无用的Undo页(总是)
      • 合并20个插入缓冲(总是)
      • 跳回到主循环(总是)
      • 不断刷新100个页,直到符合条件(可能在flush loop中完成)
    • 刷新循环
    • 暂停循环
  2. Async I/O Thread 
    在innodb存储引擎中大量使用AIO来处理IO请求,这样可以极大提高数据库的性能,而IO thread的工作就是负责这些IO请求的回调处理(call back),InnoDB 共有10个 IO Thread, 分别是 4个 write、4个 read、1个 insert buffer和1个 log thread。
  3. Purge Thread 
    事务提交后,其所使用的undolog可能不再需要,因此需要改线程来回收。InnoDB 引擎默认设置为4个 Purge Thread
    • 删除附注索引中不存在的记录;
    • 删除已经被打了delete-marked标记的记录
    • 删除不需要的undo log
  4. Page Cleaner Thread 
    用于将脏页的刷新操作都放入到单独的线程来完成

三、内存

  1. Buffer Pool 
    InnoDB 存储引擎是基于磁盘存储的,其中的记录按照页的方式进行管理,由于 CPU 速度和磁盘速度之间的鸿沟, InnoDB 引擎使用缓冲池技术来提高数据库的整体性能。
    • undo page
    •  insert buffer page
      不是缓冲池的一部分,Insert Buffer是物理页的一个组成部分,它带来InnoDB性能的提高。根据B+算法(下文会提到)的特点,插入数据的时候会主键索引是顺序的,不会造成数据库的随机读取,而对于非聚集索引(即辅助索引),叶子节点的插入不再是顺序的了,这时需要离散地访问非聚集索引,插入性能在这里变低了。InnoDB引入插入缓冲,判断非聚集索引页是否在缓冲池中,如果在则直接插入;不在,则先放在 插入缓冲区中。然后根据上述master thread中介绍的,会有一定的频率将插入缓冲合并。此外,辅助索引不能是唯一的,因为插入到插入缓冲时,并不去查找索引页的情况,否则仍然会造成随机读,失去插入缓冲的意义了。插入缓冲可能会占缓冲池中内存,默认也能会占到1/2,所以可以将这个值调小点,到1/3。通过IBUF_POOL_SIZE_PER_MAX_SIZE来设置,2表示1/2,3表示1/3。
    • adaptive hash index 
      InnoDB存储引擎提出一种自适应哈希索引,存储引擎会监控对表上索引的查找,如果观察到建立建立哈希索引会带来速度的提升,则建立哈希索引,所以称之为自适应的。自适应哈希索引只能用来搜索等值的查询,如select * from table where index_col='***', 此外自适应哈希是由InnoDB存储引擎控制的,我们只能通过innodb_adaptive_hash_index来禁用或启用,默认开启。 
    • index page
    • data dictionary
    • lock info
  2. Redo Log Buffer 
    InnoDB 存储引擎先将重做日志信息放入这个缓冲区,然后以一定频率将其刷新到重做日志文件。重做日志文件一般不需要设置得很大,因为在下列三种情况下重做日志缓冲中的内容会刷新到磁盘的重做日志文件中。
    • Master Thread 每一秒将重做日志缓冲刷新到重做日志文件
    • 每个事物提交时会将重做日志缓冲刷新到重做日志文件
    • 当重做日志缓冲剩余空间小于1/2时,重做日志缓冲刷新到重做日志文件
  3. Additional Memory Pool 
    在 InnoDB 存储引擎中, 对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请。例如,分配了缓冲池,但是每个缓冲池中的帧缓冲还有对应的缓冲控制对象,这些对象记录以一些诸如 LRU, 锁,等待等信息,而这个对象的内存需要从额外的内存池中申请。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 体系结构 的相关文章

随机推荐

  • AI绘画Stable Diffusion原理之扩散模型DDPM

    前言 传送门 stable diffusion Git 论文 stable diffusion webui Git Google Colab Notebook部署stable diffusion webui Git kaggle Noteb
  • 量化交易框架开发实践(一)

    量化交易平台指支持通过对数据进行多维度的定量分析 结合发现的特征定制策略 并能够基于历史数据对策略进行回测 最后支持实盘买卖的交易平台 从业务流上看 量化交易可以分解成 行情获取 gt 数据清洗 gt 指标计算 gt 策略开发 gt 策略回
  • RobotStudio ABB 仿真软件过期 后的处理

    首先查看当前是在试用期还是已经过期了 查看方法如下 在打开软件后的首页找到 帮助 右侧会显示当前授权状态是否为 试用 1 如果当前在试用期内 可以通过直接修改注册表方式 修改方法 找到如下位置 HKEY LOCAL MACHINE SOFT
  • 正则表达式匹配中* . c++实现

    题目描述 请实现一个函数用来匹配包括 和 的正则表达式 模式中的字符 表示任意一个字符 而 表示它前面的字符可以出现任意次 包含0次 在本题中 匹配是指字符串的所有字符匹配整个模式 例如 字符串 aaa 与模式 a a 和 ab ac a
  • QT 怎么导入qss文件?

    方式一 比较常见的方法 QFile file qss psblack css if file open QFile ReadOnly QString qss QLatin1String file readAll qApp gt setSty
  • 提高电脑寿命的维护技巧与方法分享

    在维护电脑运行方面 我有一些自己觉得非常有用的技巧和方法 下面我将分享一些我常用的维护技巧 并解释为什么我会选择这样做以及这样做的好处 首先 我经常清理我的电脑内部的灰尘 电脑内部的灰尘会影响散热效果 导致电脑发热严重甚至性能下降 因此 定
  • Google Colab 上部署 Stable Diffusion Web UI

    什么是 Stable Diffusion Web UI Colab Stable Diffusion 是 Stability AI 推出的一个基于深度学习技术文字生成图片AI模型 Stable Diffusion Web UI 是一个强大好
  • [技术经理]03 到底是能力重要,还是态度重要?

    对于一个技术团队而言 团队里面的人员是最最重要的财富 人员的招聘和人员的管理是技术经理最重要的工作之一 但是 事实也是 没有什么问题比人的问题更难处理的了 我先讲两个发生在我们团队里面的事件 今年上半年的时候 我们团队同时入职了两名前端开发
  • C语言中sizeof()和strlen()的区别

    sizeof 一 sizeof的基本概念 sizeof操作符以字节形式给出了其操作数的存储大小 操作数可以是一个表达式或括在括号 内的类型名 操作数的存储大小由操作数的类型决定 二 使用方法 1 用于数据类型 sizeof使用形式 size
  • UBUNTU16.04命令行安装PCL1.7(亲测有效)

    安装PCL点云库 最开始是按照先安装相关依赖 然后github上clone PCL相关版本包的形式安装的 编译遇到了很多问题 结果最后安装完成 但却无法运行例程 难过 又尝试了命令行的形式 命令行的形式直观简单 可安装编译好的点云库 PCL
  • [Python人工智能] 九.gensim词向量Word2Vec安装及《庆余年》中文短文本相似度计算

    从本专栏开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前一篇详细讲解了卷积神经网络CNN原理 并通过TensorFlow编写CNN实现了MNIST分类学习案例 本篇文章将分享gensim词向量Word2Vec安装
  • 时频分析常用工具:STFT短时傅里叶变换 & 小波变化

    文章目录 1 傅里叶变换的局限性 2 STFT 3 小波变换 参考 时频分析之STFT 短时傅里叶变换的原理与实现 形象易懂讲解算法I 小波变换 https www zhihu com question 58814934 1 傅里叶变换的局
  • MSCOCO数据集格式转化成VOC数据集格式

    MSCOCO数据集格式转化成VOC数据集格式 转载请注明原出处 http blog csdn net ouyangfushu article details 79543575 作者 SyGoing QQ 2446799425 SSD目标检测
  • CUDA(C)和PyCUDA(Python) GPU加速OpenCV视觉

    CUDA 本节介绍一个简单的加法程序 该程序在设备上执行两个变量的加法 虽然它没有利用设备的任何数据并行性 但它对于演示 CUDA C 的重要编程概念非常有用 首先 我们将看到如何编写一个用于添加两个变量的内核函数 内核函数的代码如下所示
  • 面试之JVM类的生命周期

    按照Java虚拟机规范 从class文件到加载到内存中的类 到类卸载出内存为止 它的整个生命周期包括如下7个阶段 加载 类的加载指的是将类的 class文件中的二进制数据读取到内存中 存放在运行时数据区的方法去中 在加载的过程中 jvm需要
  • FFMPEG之H264获取NALU并且解析其RBSP类型03

    FFMPEG之H264获取NALU并且解析其RBSP类型03 前言 FFMPEG之H264理论篇 理论的就不多讲了 可以参考上面那篇文章 下面将给出两种版本 一种是我自己的 用C 方法实现 另一种是雷神版本的 基本是纯C语言 区别是我多了一
  • MySQL 排序时如何把0放最后, 其它按照从小到大排序

    问题描述 MySQL 在排序时 如何从小到大排序 并将0排在最后面 如图 解决办法 利用CASE THEN来处理 原理是将sort等于0的转为比较大的数值放到了最后 其实也是遵循了 sort ASC 的原则 SELECT FROM bann
  • JUC编程

    1 JUC JUC就是java util concurrent工具包的简称 这是一个处理线程的工具包 JDK 1 5开始出现的 1 传统的synchronized public class Synchronized public stati
  • 教你如何将磁盘中黑色的未分配空间变成绿色的可用空间

    在黑色的未分配空间上建立新的卷 使用分区助手或者DiskGenius将新建立的卷从主分区转换成逻辑分区 在磁盘管理中删除这个卷 然后就会变成绿色的空用空间
  • MySQL 体系结构

    一 物理文件 参数文件 告诉Mysql实例启动时在哪里可以找到数据库文件 并且指定某些初始化参数 这些参数定义了某种内存结构的大小等设置 用文件存储 可编辑 若启动时加载不到则不能成功启动 与其他数据库不同 参数有动态和静态之分 静态相当于