MySql教程
mysql 面试突击 mysql和innodb原理与机制
本文主要是介绍mysql 面试突击 mysql和innodb原理与机制,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
mysql
innodb结构
内存及文件
Buffer Pool:缓冲池
在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率
以Page页为单位,Page页默认大小16K,链表结构
page根据状态分为3类
free page : 空闲page,未被使用
free list :表示空闲缓冲区,管理free page
clean page:被使用page,数据没有被修改过
lru list:表示正在使用的缓冲区,管理clean page和dirty page,
缓冲区以midpoint为基点,
前面链表称为new列表区,存放经常访问的数据,占63%;
后面的链表称为old列表区,存放使用较少数据,占37%
普通LRU:末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰
改性LRU:
链表分为new和old两个部分,
加入元素时并不是从表头插入,而是从中间midpoint位置插入,
如果数据很快被访问,那么page就会向new列表头部移动,
如果数据没有被访问,会逐步向old尾部移动,等待淘汰。
dirty page:脏页,被使用page,数据被修改过,页中数据和磁盘的数据产生了不一致
flush list:表示需要刷新到磁盘的缓冲区,管理dirty page,
内部page按修改时间排序。
脏页即存在于flush链表,也在LRU链表中,但是两种互不影响,
LRU链表负责管理page的可用性和释放,而flush链表负责管理脏页的刷盘操作
page页的管理:
每当有新的page数据读取到buffer pool时,InnoDb引擎会判断是否有空闲页,是否足够,
如果有就将free page从free list列表删除,放入到LRU列表中。
没有空闲页,就会根据LRU算法淘汰LRU链表默认的页,将内存空间释放分配给新的页
Adaptive Hash Index:自适应哈希索引
用于优化对BP数据的查询
InnoDB存储引擎会监控对表索引的查找,
如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应。
InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引
Change Buffer:写缓冲区
当更新一条记录时,
该记录在BufferPool存在,直接在BufferPool修改,一次内存操作。
如果该记录在BufferPool不存在(没有命中),
会直接在ChangeBuffer进行一次内存操作,不用再去磁盘查询数据,避免一次磁盘IO。
当下次查询记录时,会先进性磁盘读取, 然后再从ChangeBuffer中读取信息合并,最终载入BufferPool中
写缓冲区,仅适用于非唯一普通索引页
如果在索引设置唯一性,在进行修改时,InnoDB必须要做唯一性校验,因此必须查询磁盘,做一次IO操作。
会直接将记录插入到BufferPool中,然后在缓冲池修改,不会在ChangeBuffer操作
ChangeBuffer占用BufferPool空间,默认占25%,最大允许占50%
可以根据读写业务量来进行调整。参数innodb_change_buffer_max_size
Log Buffer:日志缓冲区
在DML操作时会产生Redo和Undo日志,被缓冲在日志缓冲区。
日志的刷新:innodb_flush_log_at_trx_commit参数控制日志刷新行为,默认为1
0:每隔1秒写日志文件和刷盘操作(写日志文件LogBuffer–>OS cache,刷盘OScache–>磁盘文件),最多丢失1秒数据
1:事务提交,立刻写日志文件和刷盘,数据不丢失,但是会频繁IO操作
2:事务提交,立刻写日志文件,每隔1秒钟进行刷盘操作
日志缓冲区满时会自动将其刷新到磁盘,当遇到BLOB或多行更新的大事务操作时,增加日志缓冲区可以节省磁盘I/O。
系统表空间(The System Tablespace)
数据字典(InnoDB Data Dictionary)
InnoDB数据字典由内部系统表组成,这些表包含用于查找表、索引和表字段等对象的元数据。
元数据物理上位于InnoDB系统表空间中。
由于历史原因,数据字典元数据在一定程度上与InnoDB表元数据文件(.frm文件)中存储的信息重叠
双写缓冲区(Doublewrite Buffer)
作用:防止将脏页刷新到磁盘中,出现部分写的问题。
innodb的页大小默认是16K,Linux的block size是4K,
刷新过程中os crash或者停电,会导致部分数据写入到磁盘中,导致数据不一致。
innodb现将buffer pool中的数据写入到doublewrite buffer中,再刷新到磁盘中。
如果是刷盘过程中出现问题。innodb将doublewrite 中的数据刷新到数据库即可,
若写到doublewrite出错,则用原始数据和redo日志恢复
参考:https://www.cnblogs.com/geaozhang/p/7241744.html
写缓冲区 change buffer
撤销日志(Undo Logs)
用户在系统表空间创建的表数据和索引数据
系统表空间是一个共享的表空间因为它是被多个表共享的。
该空间的数据文件通过参数innodb_data_file_path控制,默认值是ibdata1:12M:autoextend(文件名为ibdata1、12MB、自动扩展)
单表表空间(File-Per-Table Tablespaces)
默认开启
被.ibd文件代表
共享表空间(General Tablespaces)
CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd Engine=InnoDB; //创建表空间ts1
CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1; //将表添加到ts1表空间
临时表空间(Temporary Tablespaces)
session temporary tablespaces 存储的是用户创建的临时表和磁盘内部的临时表。
global temporary tablespace储存用户临时表的回滚段(rollback segments )。
mysql服务器正常关闭或异常终止时,临时表空间将被移除,每次启动时会被重新创建。
撤销表空间(Undo Tablespaces)
撤销表空间由一个或多个包含Undo日志文件组成
撤消日志是在事务开始之前保存的被修改数据的备份,用于例外情况时回滚事务。
撤消日志属于逻辑日志,根据每行记录进行记录。
撤消日志存在于系统表空间、撤消表空间和临时表空间中。
日志
mysql server层的日志
binlog:更新操作,用于同步
通用查询日志:记录一般查询,一般不开启
慢查询:通常我们开启
错误日志:默认开启,连接错误啥的
innodb
redo log
用于在崩溃恢复期间更正不完整事务写入的数据。
redo log包括内存和文件两个部分,中间有操作系统的缓冲
记录InnoDB中对Buffer Pool中Page修改的日志,即物理日志,区别于binLog的具体操作日志,即逻辑日志
日志写入硬盘时无需doublewrite
重做日志(内存和硬盘文件)按512字节存储,成为redo block
如果大于 512字节会拆分成多个块存储
写入硬盘时按照redo block写入,即512字节,是硬盘层面最小的写入单位,保证写入必定是原子的
undo log
目的是发生错误时回滚,也是MVCC机制的一部分
存在表空间的undo段
数据的逻辑变化,当发生回滚时,反向操作,即可以恢复到原来的样子
事务开启后,修改记录前,将前值记录undo日志中
写undo的redo
写undo
修改数据页
写Redo
redo
这篇关于mysql 面试突击 mysql和innodb原理与机制的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
您可能喜欢
部署MySQL集群项目实战:新手入门教程
11-04
如何部署MySQL集群资料:新手入门指南
11-04
MySQL集群项目实战:新手入门指南
11-02
初学者指南:部署MySQL集群资料
11-02
部署MySQL集群教程:新手入门指南
11-01
如何部署MySQL集群:新手入门教程
11-01
部署MySQL集群学习:新手入门教程
11-01
部署MySQL集群入门:新手必读指南
11-01
BinLog入门:新手必读的MySQL二进制日志指南
10-23
Binlog入门:MySQL数据库的日志管理指南
10-23
MySQL数据库入门教程:从安装到基本操作
10-22
MySQL读写分离入门教程:轻松实现数据库性能提升
10-22
MySQL分库分表入门教程
10-22
MySQL慢查询的诊断与优化指南
10-22
MySQL索引入门教程:快速理解与应用指南
10-22
栏目导航
前端开发
HTML5教程
CSS教程
Javascript
jQuery教程
AJAX教程
Node.js教程
XML教程
正则表达式
后端开发
Go教程
C/C++教程
消息队列MQ
Net Core教程
Asp.net教程
Java教程
PHP教程
移动端开发
微信公众号开发
小程序开发
Swift教程
IOS教程
Kotlin教程
Android开发
数据库
Redis教程
MongoDB教程
PostgreSQL教程
Oracle教程
MariaDB教程
SqLite教程
MySql教程
SqlServer教程
服务器运维
Kubernetes
Docker容器
linux shell
Nginx教程
网站安全
PowerShell教程
Linux教程
人工智能
TensorFlow教程
Python教程
机器学习
人工智能学习
区块链
区块链技术
游戏开发
游戏编程
Unity3D教程
网站运营
网站策划
网站优化
建站知识
大数据/云计算
云计算
Hadoop教程
软件工程
软件/开发工具使用
Git教程
资讯