所在的位置: mysql >> mysql优势 >> MYSQLgtInnoDB引擎底

MYSQLgtInnoDB引擎底

逻辑存储结构

逻辑存储结构图

表空间

表空间文件在Linux下存放在/var/lib/mysql文件中的xxx.ibd文件就是表空间文件

表空间文件用来存储,记录,索引等数据。

段分为,数据段(Leafnodesegment),索引段(Non-leafnodesegment),回滚段(Rollbacksegment),InnoDB是索引组织表,数据段就是B+树的叶子节点,索引段就是非叶子节点,段用来管理Extend(区)。

一个段相当于一张表

区是表空间的单元结构,每个区大小为1M,默认情况下InnoDB存储引擎页大小为16k,一个区一共16个连续的页。

页,是InnoDB存储引擎磁盘管理的最小单元。

每个区默认16KB,为了保证页的连续性,InnoDB存储引擎每次从磁盘申请4到5个区。

行指的是InnoDB存储的数据

表结构中俩个隐藏字段

Trx_id:最后一次操作事务的id

Rollpointer:指针,指向增删改之前的数据,可以拿这个找到修改之前的数据。

架构

MySQL5.5版本后,默认使用InoDB存储引擎。

它擅长事务处理,具有崩溃恢复性特性!

下图为InnoDB架构图,左边为内存结构,右边为磁盘结构。

内存结构

BufferPool(缓冲池)

缓冲池是主内存的一个区域,里面可以缓存磁盘上经常操作的真实数据。

在执行增删改查操作的时候,先操作缓存池中的数据(如果没有,从磁盘加载并且缓存)

然后以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度

在缓存池中有一块一块的,这个是页。

缓存池以页为单位,底层采用链表数据结构管理Page。

根据状态将Page分为三类:

freepage:空闲页,未被使用的页。

cleanpage:被使用的页,数据没有被修改过。

dirtypage:脏页,被使用的页,页中数据和磁盘中数据不一致。

ChangeBuffer(更改缓存区)

介绍

更改缓存区,主要针对非唯一的二级索引。

在执行DML语句时,如果这些数据页不在BufferPoor中,不会直接操作磁盘,而是将数据变更在更改缓存区ChangeBuffer中。

在未来数据被读取的时候,再将数据合并恢复到BufferPool中,再将合并后的数据刷新到磁盘中。

意义

和聚集索引不同,二级索引是非唯一的!

并且二级索引以相对随机的顺序插入。

同样的删除和更新可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量磁盘IO。

有了ChangeBuffer后,我们可以在缓冲池中进行合并处理减少磁盘IO

LogBuffer(日志缓存区)

日志缓存区,用来保存要写入磁盘中的log日志数据(redolog、undolog)。

默认大小16MB,日志缓存区的日志会定期刷新到磁盘中。如果需要更新、插入、或删除多行的事务,增加日志缓存区大小可以节约磁盘IO

在系统变量中设置即可

关键字:

innodb_log_buffer_size缓存区大小

innodb_flush_log_at_trx_


转载请注明:http://www.aierlanlan.com/grrz/2570.html