结构

mysql是基于硬盘的数据库,但是由于硬盘速度太慢所以使用内存来缓存部分数据以提高速度,因此mysql存储主要分为内存与硬盘两部分;
内存
buffer pool
缓冲池中包含索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictionary)等。
freeList
fluList
lruList
lru算法
mysql为了避免频繁的刷数据或者把热数据从缓存中刷出去,对lru算法进行了一定优化
mysql将缓冲池分为了热数据(5/8)与冷数据(3/8)两部分
1、对于读取的数据
1、预读的放在冷数据的头部
2、请求的数据直接放在热数据头部
2、如果冷数据被读取后放在热数据的头部
changeBuffer
adaptive Hash Index
log buffer
硬盘
table
mysql 默认事每个table单独一个文件 禁用innodb_file_per_table 可以让表都存在system tablespace
.frm文件保存了对应表的定义等元信息
索引
通常使用b-tree结构,但是空间索引使用r-tree
索引分为聚簇索引与第二索引
索引排序构建
1、扫描聚簇索引放入sort buffer,当缓冲区满了就写入临时文件
2、合并各个临时文件
3、将结果写入b-tree
在引入排序构建前都是一条一条插入会频繁引起树的的分裂与合并,效率低下
innodb_fill_factor 用于控制索引页预留空间(当设置为80时保留20%的空间,实际值可能不一致),以避免将来发生变更时减少页的分裂与合并,只会运用在索引上不会用在存放text与blob的也上
table space
system tablesapce
默认只有一个文件存放信息在数据目录下ibdata1
存放了 数据词典(不知道是啥。。。) 双写buffer、change buffer、undo logs以及创建在system tablespace中的表与索引
file-per-table tablespace、
general tablesapce
undo tablespace
存放undolog
temporary tablespace
用于存放临时表的空间,在停止服务时会删除,启动时会创建如果无法创建则mysql服务不会启动
double writebuffer
双写缓冲将数据冲 buffer pool写回磁盘是多写一份(顺序写入,并不是写回磁盘真正位置,由于顺序写所以开销不大),在刷盘崩溃后可以从此处回复数据

浙公网安备 33010602011771号