01--MySQL的内部结构

本文深入探讨MySQL的InnoDB存储引擎特性,包括缓存机制、内存结构、日志管理和表空间等方面,帮助读者理解其高效稳定运行背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01、查询缓存

把数据以KV的形式放到内存里面,可以加快读取。但是MySQL的默认缓存是关闭的。

为什么MySQL不推荐使用它自带的缓存呢?

第一:要求SQL语句很严格,必须要一模一样。

第二:表里面的任何数据发生变化的时候,缓存都会失效。对大量数据的更新不适合。

02、存储引擎

MyISAM、InnoDB、Memory、CSV、Archive

MyISAM的特点如下:

支持表级别的锁(插入和更新会锁表)。不支持事务。

拥有较高的插入(insert)和查询(select)速度。

存储了表的行数(count速度更快)。

InnoDB的特点

支持事务,支持外键,因此数据的完整性、一致性更高。

支持行级别的锁和表级别的锁。

支持读写并发,写不阻塞读(MVCC)。

特殊的索引存放方式,可以减少IO,提升查询效率。

Memory特点:

把数据放在内存里面,读写的速度很快,但是数据库重启或者崩溃,数据会全部消失。只适合做临时表。

03、InnoDB内存结构

【1】、Buffer Pool

缓存的是数据页、索引页等。

内存的缓冲池写满了怎么办?InnoDB用LRU算法来管理缓冲池。LRU:最近最少使用.

当需要更新一个数据页时,数据页在BufferPool中不存在,怎么操作?

【2】、Change Buffer 写缓存

数据页不是唯一索引,不存在数据重复的情况下,可以先把修改记录在内存的缓冲池中,从而提升更新语句的执行速度。

Change Buffer里面的数据记录,记录到数据页的操作叫做merge。

什么时候发生merge?

通过后台线程、数据库shut downredo log写满时触发。

ChangeBuffer占BufferPool的比例,默认25%。

【3】、Adaptive Hash Index

【4】、redo Buffer(重点)

出现数据库宕机或者重启时候,BufferPool里面的记录没有刷入磁盘,导致数据丢失。这种情况怎么解决?

InnoDB把所有对页面的修改操作专门写入redo log文件,并且在数据库启动时从这个文件进行恢复操作。

redo log 存储在/var/lib/mysql/目录下的ib_logfile0和ib_logfile1,每个48M。

关键点就是先写日志,再写磁盘(WAL技术)。

注意:redo log的内容主要是用于崩溃恢复。磁盘的数据文件,数据来自buffer pool。redo log写入磁盘,不是写入数据文件。

特点:

1、redo log是InnoDB存储引擎实现的

2、不是记录数据页更新之后的状态,而是记录这个页做了什么改动,属于物理日志

3、redo log的大小是固定的,前面的内容会被覆盖。

【5】、log Buffer【重要】

当然redo log 不是每一次都直接写入磁盘,在Buffer Pool里面有一块内存区域(Log Buffer)专门用来保存即将要写入日志文件的数据,默认16M。

我们写入数据到磁盘的时候,操作系统本身是有缓存的。flush就是把操作系统缓冲区写入到磁盘。

log buffer写入磁盘的时机,由一个参数控制,默认是1。

每次事务提交时MySQL都会把log buffer的数据写入log file,并且刷到磁盘中去。

【6】、undo log tablespace 重点

undo log(撤销日志或回滚日志)记录了事务发生之前的数据状态(不包括select)。

undoLog的数据默认在系统表空间ibdata1文件中。

【7】、总结:更新操作的流程。

update user set name='xxxx' where id=1;

1、事务开始,从内存或磁盘取到这条数据,返回给Server的执行器;

2、执行器修改这一行数据的值为xxxx;

3、记录name=‘原来的值’到undo log;

4、记录name=xxxx到redo log;

5、调用存储引擎接口,在内存(Buffer Pool)中修改name=xxxx;

6、提交事物

【8】、Binlog

binlog以事件的形式记录了所有的DDL和DML语句,记录的是操作而不是数据值,属于逻辑日志

作用?数据的恢复和主从复制。

03、表空间

双写缓冲区

如果这个页本身已经损坏了,用它来做崩溃恢复是没有意义的。所以在对于应用redolog之前,需要一个页的副本。如果出现了写入失效,就用页的副本来还原这个页,然后再应用redo log。这个页的副本就是double write,InnoDB的双写技术。通过它实现了数据页的可靠性。

【1】、系统表空间 system tablespace

在默认情况下InnoDB存储引擎有一个共享表空间(对应文件/var/lib/mysql/ibdata1),也叫系统表空间

【2】、独占表空间 file-per-table tablespaces

可以让每张表独占一个表空间。

【3】、通用表空间general tablespaces

创建一个通用的表空间,用来存储不同数据库的表

【4】、临时表空间temporary tablespaces

存储临时表的数据,包括用户创建的临时表,和磁盘的内部临时表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值