Mysql Innodb体系结构
2017-05-07 16:32
281 查看
Innodb体系结构
内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据、缓存磁盘数据,修改文件前先修改内存、redo log
后台线程:刷新内存池中的额
内存
缓冲池
读页数据时,先将磁盘上的页数据“FIX”到缓冲池,下次读即可直接从缓冲池中读。
修改数据时,先修改缓冲池中的页数据,然后刷新到磁盘,并不是每次都刷新而是通过Checkpoint机制刷新到磁盘。
数据页类型:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引、锁信息、数据字典信息等
缓存池通过LRU算法管理。
LRU、Free List、Flush List
Innodb LRU:在LRU队列中加入midpoint位置,默认值5/8,表示新读取的页加入到列表的5/8位置。midpoint之后列表成为old表,之前称为new表。即列表尾端到表尾37%为old表,其余为new表。new表存放活跃数据。
Free List:数据库启动时LRU表为空,页均存放在Free List中。需要使用时从该表中获取。
Flush List管理缓存中被修改过的页。
unzip_LRU,压缩页大小为1、2、4、8KB,其还是属于LRU管理。unzip_LRU对不同大小页分开管理,采用伙伴算法分配内存。
redo log buffer
Master Thread每秒执行一次。
事物提交时。
redo log buffer剩余空间小于1/2。
额外的内存池
线程
Master Thread
IO Thread
Purge Thread
Page Cleaner Thread
Checkpoint
Sharp Checkpoint
Fuzzy Checkpoint
Master Thread Checkpoint:Master Thread异步已一定频率刷新一定比例脏页。
Flush_LRU_LIST Checkpoint:为了保证LRU中有一定数量的空闲页,Page Clear Thread将对LRU中尾端页进行移除,如果存在脏页则做刷新。
Async/Sync Flush Checkpoint:为了保证redo log循环使用(覆盖),对于需要将redo文件中不可用的脏页进行刷新到磁盘。
Dirty Page too much Checkpoint:脏页数量太多。
Master Thread工作方式
Innodb 1.2.x之前
while(true){ //差不多1s一次 for(int i in 0..9){ 刷新日志缓存到磁盘 //1s内的统计值 if IO < 5 合并插入缓存 if 脏页比例 > 预定值 刷新部分脏页(不超过100) if 没有用户活动 进入background loop{ 删除无用undo页 合并20个插入缓冲 可能跳到flush loop{ 可能跳到suspend loop } 跳回主loop } sleep 1s; } //差不多10s一次 if IO < 200 //10s内 刷新100个脏页到磁盘 合并最多5个插入缓冲 刷新日志缓冲 删除无用undo 刷新100或10个脏页 }
Innodb 1.2.x
if innodb is idle 执行每10s一次的操作 else 执行每秒执行的操作
nnodb关键特性
插入缓冲
插入非聚集索引时,先判断该索引页是否在缓冲池中,在则直接插入。否则写入到Insert Buffer对象。
条件:二级索引,索引不能是unique(因为如果是unique则必须保证唯一性,此时得检查所有索引页,还是随机IO了)
Change Buffer:包括Insert Buffer、Delete Buffer、Purge Buffer,update操作包括将记录标记为已删除和真正将记录删除两个过程,对应后两个Buffer。
Insert Buffer内部是一颗B+树
Merge Insert Buffer三种情况:
对应的索引页被读入缓冲池。
对应的索引页的可用空间小于1/32,则强制进行合并。
Master Thread中的合并插入缓冲。
两次写
1. 先将脏页数据复制到doublewrite buffer中(2MB内存) 2. 将doublewrite buffer分两次,每次1MB写入到doublewrite磁盘(2MB)中。 3. 马上同步脏页数据到磁盘。对于数据混乱的页则可以从doublewrite中读取到,该页写到共享表空间。
自适应哈希索引
异步IO
刷新邻接页
相关文章推荐
- Mysql Innodb体系结构
- Mysql Innodb体系结构
- MySQL InnoDB体系结构
- Mysql Innodb体系结构
- mysql体系结构 &&& Mysql Innodb小结
- 关于MYSQL InnoDB 表的备份与恢复
- mysql innodb myisam 性能对比
- mysql innodb 和myisam的区别
- MYSQL集群与INNODB事务处理的对比总结
- How Logs Work On MySQL With InnoDB Tables
- MySQL InnoDB 的性能问题讨论
- mysql表类型MyISAM和InnoDB比较
- 反驳"MySQL InnoDB (不行)的性能问题",千万级别记录来测试说明
- mysql 5.0.45,have innodb,disabled
- mysql innoDB 使用外键的问题
- MySQL中MyISAM引擎与InnoDB引擎性能简单测试
- mysql中MyISAM和InnoDB的区别
- Default storage engine (InnoDB) is not available导致mysql无法启动的解决办法
- mysql对InnoDB表的限制
- mysql使用innodb需要注意的情况