🗒️Day58【概念解析】InnoDB架构设计
00 分钟
2023-11-18
2023-11-23
type
status
date
slug
summary
tags
category
icon
password

前言

😄
作为MySQL5.6之后的默认存储引擎,InnoDB因其支持事务、外键等特性可是风靡一时,现在也是数据库理论中的面试必备要素,知其然还须知其所以然,那么掌握其架构当然也是至关重要。

整理定义

左边是InnoDB的内存数据架构(In-Memory Structure),右边是磁盘数据架构(On-disk Structure)

复述展开

InnoDB 内存结构设计

InnoDB作为MySQL的一个存储引擎,它的内存结构设计用于优化数据处理性能。InnoDB的内存结构主要包括以下几个部分:
  1. Buffer Pool这是InnoDB最重要的内存结构之一,用于缓存表数据和索引。当MySQL需要读取或写入数据时,它首先会查看这些数据是否已经在Buffer Pool中。如果在,那么就可以直接从内存中读取或写入,避免了磁盘I/O操作,从而大大提高了性能。
  1. Change Buffer:Change Buffer是Buffer Pool的一部分,用于缓存对二级索引的修改操作。当MySQL需要修改二级索引时,它可以先将修改操作写入Change Buffer,然后在后台慢慢地将这些修改应用到磁盘上的索引,这样可以减少磁盘I/O操作,提高性能。
  1. Adaptive Hash Index:这是InnoDB的一个优化特性,用于加速对Buffer Pool中数据的访问。当MySQL反复访问同一数据时,InnoDB会自动创建一个哈希索引,使得MySQL可以更快地找到这些数据。
  1. Log Buffer:这是InnoDB的另一个重要内存结构,用于缓存事务日志。当MySQL执行一个事务时,它会先将事务日志写入Log Buffer,然后在适当的时机将这些日志刷新到磁盘上,这样可以减少磁盘I/O操作,提高性能。
  1. InnoDB内部数据字典:InnoDB有一个内部的数据字典,用于存储表的元数据,如表的结构信息、索引信息等。

InnoDB 磁盘结构

InnoDB的磁盘结构是其如何在磁盘上存储数据和索引的方式。以下是InnoDB磁盘结构的主要组成部分:
  1. 表(Tables):InnoDB存储引擎中的表是行式存储的,每个表都有一个或多个聚簇索引或非聚簇索引。表中的数据按主键顺序存储在聚簇索引中。
  1. 索引(Indexes):InnoDB使用B+树数据结构来实现索引,以加快数据访问速度。每个表至少有一个聚簇索引(主键索引),也可以有一个或多个二级索引。
  1. 表空间(Tablespaces):表空间是InnoDB存储数据和索引的地方。默认情况下,所有的InnoDB表都存储在一个名为ibdata1的系统表空间中,但用户也可以配置InnoDB使用多个或单独的表空间。
  1. 双写缓冲区(Doublewrite Buffer):双写缓冲区是InnoDB用来保护数据完整性的一种机制。在将数据页写入磁盘之前,InnoDB会先将其写入双写缓冲区。如果在写入过程中发生系统崩溃,InnoDB可以使用双写缓冲区中的数据恢复损坏的页。
  1. 重做日志(Redo Log):重做日志是InnoDB用来保证事务的持久性的一种机制。在事务提交时,InnoDB会先将事务的修改记录到重做日志,并确保重做日志被写入磁盘。如果在事务提交后发生系统崩溃,InnoDB可以使用重做日志恢复未完成的事务。
  1. 回滚日志(Undo Logs):回滚日志是InnoDB用来实现多版本并发控制(MVCC)和事务回滚的一种机制。当事务修改数据时,InnoDB会在回滚日志中保存修改前的数据。如果事务需要回滚,或者其他事务需要读取修改前的数据,InnoDB可以使用回滚日志来获取这些数据。

理解体会

理解InnoDB的结构是非常重要的,主要有以下几个原因:
  1. 性能优化:理解InnoDB的内存和磁盘结构可以帮助你更好地理解MySQL的性能瓶颈,并进行有效的优化。例如,理解Buffer Pool和Redo Log的工作原理可以帮助你更好地配置这些参数,以提高MySQL的性能。
  1. 数据恢复:当数据库发生故障时,理解InnoDB的结构可以帮助你更好地进行数据恢复。例如,理解Doublewrite Buffer和Redo Log的工作原理可以帮助你恢复因系统崩溃而损坏的数据。
  1. 事务管理:理解InnoDB的事务管理机制,如Undo Logs和MVCC,可以帮助你更好地理解事务的行为,如何处理并发控制和事务隔离。
💡
如何学习呢?
  • 阅读相关书籍,最好是英文版,中文版的话一则需要翻译过程,可能过时,二则翻译过程中没有办法原汁原味,可能会失去一些干货,如果有能力的话最好还是阅读英文。如果英文基础确实不好,那还是读中文版本的。
  • 实践操作,除了理论学习之外,还是需要实践操作的。”实践是检验真理的唯一标准“。在实际过程中,可能能够发现更多纸上找不到的东西。
  • 源码学习,这是最难的一点,也是最直接的一点,show me code 。结合源码,更能够体会设计的实际含义在内的。
 

参考:

📌
快速跳转链接
【概念解析】启动
【概念解析】Day 1 - 10
【概念解析】Day 11 - 20
【概念解析】Day 21 - 30
【概念解析】Day 31 - 40
【概念解析】Day 41 - 50
【概念解析】Day 51 - 60
【概念解析】Day 61 - 70
【概念解析】Day 71 - 80
【概念解析】Day 81 - 90
 
上一篇
Day59【概念解析】InnoDB Buffer Pool
下一篇
Day57 【概念解析】 MVCC

评论
Loading...