InnoDB Architecture InnoDB 结构 2021-01-10

最近发现对于MySQL的认识不足,想从MySQL官方文档入手,学习一下MySQL相关知识。想说的是,发现很多面试所谓“考点”和各种技术博客的内容,其实在官方文档中很明确得写出来了。读MySQL官方文档还是挺有用的。

OK,正文开始:

下图展示了InnoDB储存引擎的结构,包括In-Memory Structures(内存数据结构)和On-Disk Structures(磁盘数据结构)两个部分。

In-Memory Structures 的介绍见本文;
On-Disk Structures的介绍尚未完成。

innodb-architecture.png

1、Buffer Pool 缓冲池
缓冲池是内存中的一片区域,InnoDB将访问过的表数据和索引数据缓存在其中。缓冲池使得频繁访问的数据能够直接从内存中读出,加快了读取速度。缓冲池由"页"组成,数据行存储于这些“页”上。这些“页”组成链表结构,这些链表的顺序根据LRU算法调整。(least recently used algorithm,LRU算法,刚刚被访问到的已经缓存了的数据,向上移动;刚刚访问到的没有缓存的数据,插入中间;最靠下的已经许久没有被访问到的数据页被清除出缓存。)这个过程如下图所示。

innodb-buffer-pool-list.png

2、Change Buffer
要清楚这个概念,先了解一下 clustered index (聚簇索引)和secondary index(二级索引)。
clustered index :聚簇索引就是InnoDB的主键索引。The InnoDB term for a primary key index. InnoDB table storage is organized based on the values of the primary key columns, to speed up queries and sorts involving the primary key columns.意思是:主键索引的叶子节点,不仅存储主键,而且存储整个数据。也就是说整个主键索引的结构就是整个表的数据结构。
secondary index:A type of InnoDB index that represents a subset of table columns. An InnoDB table can have zero, one, or many secondary indexes. (Contrast with the clustered index, which is required for each InnoDB table, and stores the data for all the table columns.) 对于InnoDB来说,secondary index就是除主键索引之外的其他索引。
Change Buffer这个区域用来存储对于不在buffer pool 中的secondary index数据页的修改。INSERT、DELETE、UPDATE三种操作都能触发这个操作。当这个数据页被读取的时候,这个数据页会与change Buffer中的修改进行合并,然后存储到buffer pool中。
当整个系统不忙碌之后,purge operation会将更新后的二级索引页数据更新到磁盘上。

innodb-change-buffer.png

3、Adaptive Hash Index
Adaptive Hash Index 用于优化对Buffer Pool的访问,建立的哈嘻索引。

4、Log Buffer
用于存放需要写到磁盘上的日志数据。

5、总结:

InnoDB存储引擎,
1)数据存储包含内存与磁盘两个部分;
2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page);
3)buffer pool用于优化读操作;change buffer用于优化写操作(INSERT、UPDATE、DELETE)时维护二级索引的操作;log buffer用于优化mysql写日志的操作。

参考文档:
https://dev.mysql.com/doc/refman/5.7/en/innodb-in-memory-structures.html

你可能感兴趣的:(InnoDB Architecture InnoDB 结构 2021-01-10)