用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
云原生
›
Innodb架构剖析
Innodb架构剖析
海哥
论坛元老
|
2024-6-11 08:43:02
|
显示全部楼层
|
阅读模式
楼主
主题
1587
|
帖子
1587
|
积分
4761
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
整体架构
通过《口试官:一条SQL是如何实行的?》我们了解了MySQL架构,下面我们看下Innodb架构。
innodb最早由Innobase Oy公司
开发
,5.5版本开始是MySQL默认存储引擎,该存储引擎是第一个完整支持ACID事务的MySQL存储引擎(BDB是第一个支持事务的MySQL存储引擎,现在已经停止
开发
),其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有用地使用以及使用内存和CPU。下面我们具体看下innodb架构:
内存架构
Buffer Pool(缓冲池)是InnoDB存储引擎中的一个紧张组件,用于高效地缓存数据库中的数据页。它是内存中的一块区域,用于存储从磁盘读取的数据页,以加速数据的访问速率。在专用服务器上,通常将物理内存的最多80%分配给缓冲池。当InnoDB需要读取数据页时,起首会在缓冲池中查找该页是否已经被缓存。假如该页已经在缓冲池中,InnoDB可以直接从内存中获取数据,避免了磁盘IO的开销,从而进步数据访问的速率。假如该页不在缓冲池中,InnoDB会将其读取到缓冲池中,并举行相应的缓存管理。Buffer Pool的大小是通过配置参数innodb_buffer_pool_size来指定的。较大的缓冲池可以容纳更多的数据页,提供更好的缓存结果,从而减少磁盘IO操纵。合理配置缓冲池的大小对于数据库的性能至关紧张,它应该根据数据库的大小、可用内存和访问模式来举行调整。Buffer Pool的作用在于:
进步数据访问性能:通过缓存数据页,减少磁盘IO,加速数据的读取速率。
减少磁盘访问:由于数据页已经在内存中,可以减少频繁的磁盘读取操纵,降低IO开销。
优化查询性能:对于频繁访问的数据,可以直接从缓冲池中获取,减少查询的响应时间。
Change Buffer
Change Buffer是一种特别的数据结构,用于在次要索引页不在缓冲池中时缓存对其举行的更改。这些缓冲的更改大概来自于插入(INSERT)、更新(UPDATE)或删除(DELETE)操纵(DML),它们在后续的读操纵将这些页加载到缓冲池时被合并。Change Buffer的目的是降低写操纵的磁盘IO,提升数据库性能。
Log Buffer 当在MySQL中对InnoDB表举行更改时,这些更改起首存储在InnoDB日志缓冲区的内存中(Log Buffer),然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。日志缓冲区的大小由innodb_log_buffer_size 变量定义,其默认大小为16MB。日志缓冲区的内容会定期刷新到磁盘。较大的日志缓冲区可以使大型事务在提交之前无需将重做日志数据写入磁盘,从而提供更好的性能。因此,假如存在更新、插入或删除大量行的事务,则增加日志缓冲区的大小可以减少磁盘IO操纵。 innodb_flush_log_at_trx_commit变量控制日志缓冲区的内容如何写入和刷新到磁盘。innodb_flush_log_at_timeout 变量控制日志刷新的频率。
磁盘架构
InnoDB存储引擎使用页作为根本单元来管理存储空间,每个页的默认大小为16KB。对于每个索引,InnoDB使用B+树结构,此中每个节点都是一个数据页。数据页之间不必一连存储,而是通过双向链表来维护它们的顺序。
InnoDB的聚簇索引将完整的用户记录存储在叶子节点中,也就是说索引即数据,数据即索引。
为了更好地管理这些页,InnoDB引入了表空间(Tablespace)的概念。表空间是一个抽象的概念,可以对应于一个或多个实际的文件。每个表空间可以被分别为多个页,表的数据存放在特定表空间下的一些页中。InnoDB将表空间分别为几种不同的范例:
体系表空间(System Tablespace):体系表空间可以对应文件体系上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1的文件,这个文件就是对应的体系表空间在文件体系上的表示。这个文件是自扩展文件,当不够用的时候它会自己增加文件大小。也可以把体系表空间对应的文件路径不配置到数据目录下,乃至可以配置到单独的磁盘分区上,涉及到的启动参数就是innodb_data_file_path和innodb_data_home_dir。需要留意的一点是,在一个MySQL服务器中,体系表空间只有一份。
独立表空间(File-per-table Tablespace):在MySQL5.6.6以及之后的版本中,InnoDB并不会默认把各个表的数据存储到体系表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不外添加了一个.ibd的扩展名。我们也可以自己指定使用体系表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table控制。
通用表空间(General Tablespace):通用表空间是MySQL 8中引入的新特性,它答应将多个表存储在一个表空间中。通用表空间可以跨数据库和服务器共享,提供了更高的机动性和资源使用率。
临时表空间(Temporary Tablespaces):临时表空间用于存储临时表和临时文件。当实行排序、连接和其他需要临时存储的操纵时,InnoDB会使用临时表空间来存储相关数据。
此外,InnoDB还使用其他文件和机制来支持数据管理和规复:
双写缓冲文件(Doublewrite Buffer Files):双写缓冲是一种机制,用于进步数据写入的可靠性。InnoDB将数据页起首写入双写缓冲文件中,然后再将其写入实际的数据文件。这样可以在发生故障时,通过双写缓冲文件规复数据的一致性。
Undo表空间(Undo Tablespaces):撤消表空间用于存储撤消日志(undo log),用于支持事务的回滚和MVCC(多版本并发控制)。每个事务对数据的修改都会天生相应的撤消日志,这些日志被存储在撤消表空间中。
重做日志(Redo Log):重做日志是用于事务的长期性和故障规复的紧张组件。它记录了事务对数据的修改操纵,包括插入、更新和删除。重做日志文件存储在磁盘上,并在事务提交时举行长期化。
这些组件和机制共同构成了InnoDB的磁盘架构,用于管理和存储数据。
InnoDB的工作流程
当用户发起一个数据操纵哀求时,InnoDB的处置惩罚流程大致如下:
事务开始:InnoDB为每个事务分配一个唯一的事务ID,并在事务开始时创建一个事务对象。
数据读取:假如数据不在缓冲池中,InnoDB会从磁盘读取数据页面到缓冲池。
数据修改:修改操纵起首在缓冲池中举行,同时记录到重做日志缓冲区。
日志写入:日志缓冲区定期刷新到重做日志文件,确保数据的长期性。
提交事务:在事务提交时,InnoDB确保全部相关的重做日志已经写入磁盘,这个过程称为预写日志协议(Write-Ahead Logging, WAL)。
背景处置惩罚:事务提交后,InnoDB的背景线程会负责将缓冲池中修改过的页面异步刷新到磁盘,同时合并插入缓冲和维护其他内部结构。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
海哥
论坛元老
这个人很懒什么都没写!
楼主热帖
makefile简单脚本编写和Linux调试器gdb ...
【第90题】JAVA高级技术-网络编程9(简 ...
CMOS图像传感器——黑电平校正 ...
windows提权-系统错误配置提权 ...
什么是精准卫星授时?什么是NTP网络时 ...
TCP 时间戳妙用
C++ 深度解析教程(十七)C 语言异常处 ...
Linux【实操篇】—— 日志管理 ...
如何使用 FlowUs 、Notion 等笔记软件 ...
姚凯大学生创业导论课后答案2022 ...
标签云
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
Mysql
虚拟化与私有云
快速回复
返回顶部
返回列表