一、逻辑存储结构
表空间:ibd文件,一个MySQL实例可以对应多个表空间,用于存储记录,索引等数据;
段:分为数据段(leaf node segment)、索引段(non-leaf node segment)、回滚段(rollback segment),innodb是索引组织表,数据段就是B+树的非叶子节点。段用来管理多个extent(区);
区:表空间的单元结构,每个区的大小都为1M,默认情况下,innoDB存储引擎页大小为16k,即一个区中一共有64个连续页;
页:是innodb存储引擎磁盘管理的最小单元,每个页的大小默认为16kb,为了保证页的连续性,innodb存储引擎每次从磁盘申请4-5个区;
行:innodb存储引擎数据是按行进行存放的;
trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列;
rool_pointer:每次对某条记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息;
二、架构
1.内存架构
(1)缓冲池
buffer pool:缓冲池是主内存中的一个区域,里面可以缓存磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存),然后再以一定的频率刷新到磁盘,从而减少磁盘io,加快处理速度。
缓冲池以page页为单位,底层采用链表数据管理page。根据状态,将page分为三种类型:
free page:空闲page,未被使用;
clean page:被使用page,数据没有被修改过;
dirty page:脏页,被使用page,数据被修改过,页中数据与磁盘的数据产生了不一致;
缓冲池包含:更改缓冲区、自适应hash索引
(2)更改缓冲区(change buffer)
针对于非唯一二级索引页,在执行DML语句时,如果这些数据page没有在buffer pool中,不会直接操作磁盘,而会将数据变更存在更改缓冲区 change buffer中,在未来数据被读取时,再将数据合并并恢复到buffer pool中,再将合并后的数据刷新到磁盘中。
存在的意义:与聚集索引不同,二级索引通常是非唯一的,