MySQL基础(三)-学习笔记

news/2025/3/14 1:18:00/

一.innodb引擎:

1). 表空间:表空间是InnoDB存储引擎逻辑结构的最高层,启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。

2). 段:分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段 (Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点, 索引段即为B+树的 非叶子节点。段用来管理多个Extent(区)。

3). 区:表空间的单元结构,每个区的大小为1M。 默认情况下, InnoDB存储引擎页大小为16K, 即一 个区中一共有64个连续的页。

4). 页:是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。为了保证页的连续性, InnoDB 存储引擎每次从磁盘申请 4-5 个区。

5). 行 :InnoDB 存储引擎数据是按行进行存放的。

  • 默认有两个隐藏字段: Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。
  • Roll_pointer:每次对某条引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

架构:

内存结构:

Buffer Pool:缓冲池中缓存了索引页和数据页,还包含了undo页、插入缓存、自适应哈希索引以及 InnoDB的锁信息等;缓冲池以Page页为单位,底层采用链表数据结构管理Page;free page:空闲page,未被使用。 clean page:被使用page,数据没有被修改过。 dirty page:脏页,被使用page,数据被修改过,也中数据与磁盘的数据产生了不一致。

Change Buffer:更改缓冲区(针对于二级索引页),在执行DML语句时,如果这些数据Page 没有在Buffer Pool中,不会直接操作磁盘,而会将数据变更存在更改缓冲区 Change Buffer 中,在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中,减少io

Adaptive Hash Index:优化对Buffer Pool数据的查询,因为hash索引一般只需要一次IO即可,而B+树,可能需要几次匹配

Log Buffer:日志缓冲区,用来保存要写入到磁盘中的log日志数据(redo log 、undo log), 默认大小为 16MB,日志缓冲区的日志会定期刷新到磁盘中。

磁盘结构:System Tablespace是更改缓冲区的存储区域;File-Per-Table Tablespace;General Tablespaces;Undo Tablespaces-用于存储 undo log日志;Temporary Tablespaces-存储用户创建的临时表等数据;Doublewrite Buffer Files;Redo Log

后台线程:

Master Thread :

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

IO Thread:

Purge Thread:用于回收事务已经提交了的undo log

Page Cleaner Thread:协助 Master Thread 刷新脏页到磁盘的线程

二.事务原理:

事务原子性,一致性,持久性的保证:redo log, undo log ;隔离性的保证:锁和mvcc

redo log:记录的是事务提交时数据页的物理修改,是用来实现事务的持久性;该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中, 用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用;事务提交立马将redo log刷新到磁盘WAL(Write-Ahead Logging),因为操作数据一般都是随机读写磁盘的,而不是顺序读写磁盘。 而redo log在往磁盘文件中写入数据,由于是日志文件,所以都是顺序写的。顺序写的效率,要远大于随机写。当脏页成功刷新至磁盘则可以删除。

undo:回滚日志,用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚(保证事务的原子性) 和 MVCC(多版本并发控制) 。undo log是逻辑日志。delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的 update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。

Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为日志可能还用于MVCC。

Undo log存储:undo log采用段的方式进行管理和记录,存放在回滚段中

mvcc(多版本并发控制):

基本概念:

当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。如:select ... lock in share mode(共享锁),select ... for update、update、insert、delete(排他锁)都是一种当前读。

快照读:简单的select(不加锁)就是快照读,快照读,读取的是记录数据的可见版本,有可能是历史数据, 不加锁,是非阻塞读。

  • Read Committed:每次select,都生成一个快照读。
  •  Repeatable Read:开启事务后第一个select语句才是快照读的地方。
  • Serializable:快照读会退化为当前读。

mvcc:维护一个数据的多个版本, 使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还依赖于数据库记录中的三个隐式字段、undo log日志、readView。

隐藏字段:

undo log版本链:(前提:当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。 而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。)

不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

readview:(读视图)是快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务 (未提交的)id。包含四个核心字段:

版本链访问规则:trx_id 代表当前undolog版本链对应事务ID

不同的隔离级别,生成ReadView的时机不同:

  • READ COMMITTED :在事务中每一次执行快照读时生成ReadView。
  • REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。

三.日志:

错误日志:记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。查看日志位置:show variables like '%log_error%';

二进制日志:记录了所有的 DDL语句和 DML语句,不包括数据查询(SELECT、SHOW)语句。

作用:①. 灾难时的数据恢复;②. MySQL的主从复制。查看涉及到的参数:

show variables like '%log_bin%';

  • log_bin_basename:当前数据库服务器的binlog日志的基础名称(前缀),具体的binlog文件名需要再该basename的基础上加上编号(编号从000001开始)。
  • log_bin_index:binlog的索引文件,里面记录了当前服务器关联的binlog文件有哪些。

格式:

删除日志:

查询日志:记录了客户端的所有操作语句。默认情况下, 未开启

慢查询日志:记录了所有执行时间超过参数 long_query_time 设置值并且扫描记录数不小于 min_examined_row_limit 的所有的SQL语句的日志,默认未开启

四.主从复制:

指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步

优势:

  • 主库出现问题,可以快速切换到从库提供服务。
  • 实现读写分离,降低主库的访问压力。
  • 可以在从库中执行备份,以避免备份期间影响主库服务。

原理:

  • Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中
  • 从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log
  • slave重做中继日志中的事件,将改变反映它自己的数据。

分库分表:垂直拆分和水平拆分。而拆分的粒度,一般又分为分库和分表

垂直分库:以表为依据,根据业务将不同表拆分到不同库中。(每个库的表结构都不一样; 每个库的数据也不一样;所有库的并集是全量数据。)

垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。(每个表的结构都不一样; 每个表的数据也不一样,一般通过一列(主键/外键)关联; 所有表的并集是全量数据。)

水平分库:以字段为依据,按照一定策略,将一个库的数据拆分到多个库中。(每个库的表结构都一样;每个库的数据都不一样;所有库的并集是全量数据。)

水平分表:以字段为依据,按照一定策略,将一个表的数据拆分到多个表中。(每个表的表结构都一样;每个表的数据都不一样;所有表的并集是全量数据。)

实现技术:shardingJDBC与mycat

读写分离:把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。


http://www.ppmy.cn/news/1339178.html

相关文章

mac电脑风扇控制软件:Macs Fan Control Pro for mac 激活版

Macs Fan Control 是一款专门为 Mac 用户设计的软件,它可以帮助用户控制和监控 Mac 设备的风扇速度和温度。这款软件允许用户手动调整风扇速度,以提高设备的散热效果,减少过热造成的风险。 Macs Fan Control 可以在菜单栏上显示当前系统温度和…

记一次某竞赛中的渗透测试(Windows Server 2003靶机漏洞)

靶机简介 Windows Server 2003是微软公司于2003年3月28日发布的服务器操作系统,它基于Windows XP/Windows NT 5.1进行开发,并在同年4月底上市。以下是关于Windows Server 2003的详细介绍: 系统名称与发布历程: 该产品最初被命名为…

【操作系统和计网从入门到深入】(八)线程

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记,所以如果是博主比较熟悉的知识点,博主可能就直接跳过了,但是所有重要的知识点,在这个专栏里面都会提到!而且我也一定会保证这个专栏知识点的完整性&…

洗地机哪个牌子好性价比高又实惠?全能型洗地机推荐

近年来,在家居清洁工具中,洗地机出镜率非常高,是我们生活中常备的清洁工具之一,尤其在繁忙的工作之余,还要给家里做大扫除清洁的人儿。然而,市面上的洗地机品牌繁多,产品功能各异,如…

非内积级联学习

1.首页推荐非内积召回现状 非内积召回源是目前首页推荐最重要的召回源之一。同时非内积相比于向量化召回最终仅将user和item匹配程度表征为embeding内积,非内积召回仅保留item embedding,不构造user显式表征,而是通过一个打分网络计算用户-商…

一、冯诺依曼计算机

图灵与冯诺依曼两位计算机发展重要人物。冯诺依曼简介:被誉为现代计算机之父。 世界上第一台通用计算机Eniac,就有冯诺依曼的参与。他提出的思想,将数据和程序分离开了,程序是程序,数据是数据,数据可以由程…

(十六)串口UART

文章目录 UART简介传输数据帧和波特率定时器1作为串口1波特率发生器串口部分相关寄存器TMODAUXRPCONSCONSBUF 串口1工作模式1:8位UART,波特率可变总体工作原理如何简单接收一个字符和发送数据一步之遥的设置现象演示 UART简介 通用异步收发传输器(Unive…

基于 Echarts 的 Python 图表库:Pyecahrts交互式的K线图(股票)

目录 一、K线图的介绍 二、K线图的使用场景 1. 趋势分析 2. 支撑与阻力 3. 价格反转 4. 交易信号 5. 波动性分析 三、Pyecharts绘制K线图 四、总结 一、K线图的介绍 K线图(K-Line Chart)是用于显示金融市场价格走势的一种图表形式,主…