Innodb体系结构

Innodb存储引擎主要包括内存池以及后台线程。

内存池:多个内存块组成一个内存池,主要维护进程/线程的内部数据、缓存磁盘数据,修改文件前先修改内存、redo log

后台线程:刷新内存池中的额

内存

缓冲池

Innodb的数据以页的形式存储在磁盘,因此采用内存作为缓存页数据。

读页数据时,先将磁盘上的页数据“FIX”到缓冲池,下次读即可直接从缓冲池中读。

修改数据时,先修改缓冲池中的页数据,然后刷新到磁盘,并不是每次都刷新而是通过Checkpoint机制刷新到磁盘。

数据页类型:索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引、锁信息、数据字典信息等

缓存池通过LRU算法管理。

LRU、Free List、Flush List

普通LRU:最频繁的处于列表前端,最少使用处于尾端,先释放列表尾端的页。

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

redo log先都写入该buffer,而后按一定频率刷新到磁盘(1s/次),默认8M。其刷到磁盘主要一下几个情况:

Master Thread每秒执行一次。

事物提交时。

redo log buffer剩余空间小于1/2。

额外的内存池

对一些数据结构本身的内存分配是从额外内存池分配。

线程

Master Thread

负责将缓存池中的数据异步刷新到磁盘,包括脏页。合并插入缓存(INSERT BUFFER)、UNDO页的回收等。

IO Thread

Innodb中大量使用AIO处理写请求,IO Thread则主要处理这些请求的回调,包括write、read、insert buffer和log IO Thread。

Purge Thread

主要用来回收undo log,Innodb1.1之前由Master Thread负责。

Page Cleaner Thread

清理已提交事物的UNDO log。

Checkpoint

事务型数据库一般采用Write Ahead Log策略,当事物提交时先写redo log而后修改内存中的页。当数据库宕机对于还未写入磁盘的修改数据可以通过redo log恢复。Checkpoint作用在于保证该点之前的所有修改的页均已刷新到磁盘,这之前的redo log在恢复数据时可以不需要了。

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之前

主要包括主loop、background loop、flush loop和suspend loop。其中的参数可以配置。

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

Master Thread中的脏页刷新功能完全由Page Cleaner Thread执行。

if innodb is idle

执行每10s一次的操作

else

执行每秒执行的操作

nnodb关键特性

插入缓冲

当插入数据需要更新非聚集索引时,如果每次都更新则需要进行多次随机IO,因此将这些值写入缓冲对相同页的进行合并提高IO性能。

插入非聚集索引时,先判断该索引页是否在缓冲池中,在则直接插入。否则写入到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中的合并插入缓冲。

两次写

在对脏页刷新到磁盘时,如果某一页还没写完就宕机,此时该页数据已经混乱无法通过redo实现恢复。innodb提供了doublewrite机制,其刷新脏页步骤如下:

1. 先将脏页数据复制到doublewrite buffer中(2MB内存)

2. 将doublewrite buffer分两次,每次1MB写入到doublewrite磁盘(2MB)中。

3. 马上同步脏页数据到磁盘。对于数据混乱的页则可以从doublewrite中读取到,该页写到共享表空间。

自适应哈希索引

InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive) 的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页建立哈希索引。

异步IO

linux和windows中提供异步IO,其可以对连续的页做合并连续页的IO操作使随机IO变顺序IO。

刷新邻接页

刷新页时判断相邻页是否也是脏页。

mysql innodb架构_Mysql Innodb体系结构相关推荐

  1. mysql 释放空间_Mysql InnoDB删除数据后释放磁盘空间的步骤详解

    Mysql InnoDB删除数据后释放磁盘空间的方法 Innodb数据库对于已经删除的数据只是标记为删除,并不真正释放所占用的磁盘空间,这就导致InnoDB数据库文件不断增长. 如果在创建数据库的时候 ...

  2. mysql设计架构_MySQL设计架构

    在应用Impala这种所谓大年夜数据引擎的时刻,总会感到有些处所设计的不是那么精细绝伦,比如说缓存,Impala的萌芽结不雅是没有经由缓存的,也就是说每次都相当于须要从新对文件履行一遍萌芽. MySQ ...

  3. mysql服务器架构_Mysql的主从服务器架构配置

    所谓主从Mysql服务器架构,就是在主服务器上的操作同时也拷贝一份到从服务器上来. 接下来我使用两台机器做一下这个过程, 复制的作用: 1.数据分部 2.实现读的负载均衡 3.备份(本身不能备份,但是 ...

  4. mysql .frm 损坏_mysql innodb数据库损坏导致无法启动

    生产环境中的mysql突然启动不了,查了原因是innodb库错误,以前就遇到过这个问题,稀里糊涂的没解决,结果导致大量数据丢失.这些又遇到这个问题,果断把那个有问题的数据库移动了别的地方,启动了mys ...

  5. mysql innerdb 索引_mysql innodb索引原理

    聚集索引(clustered index) innodb存储引擎表是索引组织表,表中数据按照主键顺序存放.其聚集索引就是按照每张表的主键顺序构造一颗B+树,其叶子结点中存放的就是整张表的行记录数据,这 ...

  6. mysql innodb 事务_Mysql InnoDB事务

    事务特点 ACID ATOMICITY:原子性 一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这 ...

  7. mysql innodb 锁_MySQL/InnoDB锁机制

    显式加锁 select ... lock in share mode:加 S 锁 select ... for update:加 X 锁 MySQL快照读和当前读 在一个支持MVCC并发控制的系统中, ...

  8. mysql vpformysql引擎_MySQL InnoDB引擎B+树索引简单整理说明

    本文出处:http://www.cnblogs.com/wy123/p/7211742.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  9. mysql page校验_MySQL InnoDB离线校验工具innochecksum使用

    innochecksum工具可以打印InnoDB文件的校验值,该工具读取InnoDB表空间文件,计算每个页面的校验值,将计算的校验值与存储的校验值进行比较,并报告指示损坏页面的不匹配.它最初是为了加速 ...

最新文章

  1. 人工智能医疗的商业化困局
  2. Gitea 1.7.6 发布,一键部署的自助 Git 服务
  3. shell脚本:批量检查并更改MySQL数据库表的存储引擎工作中总结
  4. boost::parameter::python相关的测试程序
  5. 年薪 50w 难吗?分享我的 2 个捷径
  6. html怎么在图片上加文字_怎么把图片文字转换成word文档
  7. 浅谈Java中的==和equals
  8. 2019年Linux与开源如何统治技术圈
  9. 技巧:在 C/C++中如何构造通用的对象链表
  10. python转r字符_python r不转义变量
  11. jmeter提取mysql数据_通过jmeter读取数据库数据,并取值作为请求的入参
  12. 基于JAVA+Swing+MYSQL的汽车租赁系统
  13. 挚同道合,物所不能!挚物·AIoT产业领袖峰会报名进入倒计时!
  14. 美国《国家地理》:年度十大新闻
  15. 测试化妆品真假软件,检验化妆品真假app怎么用
  16. Mac电脑快速查找文件的两种方法
  17. mysql填写数据库_学习MYSQL过程中自己写的数据库操作
  18. 完全停止Oracle中正在运行的JOB
  19. tar 压缩文件夹到指定的目录
  20. WinRAR制作单文件(便携版)

热门文章

  1. 我们为什么使用Node
  2. 学习进度表(160519更新)
  3. JS中浮点数运算误差处理
  4. 苹果X可以升级5G吗_郭明錤:苹果5G手机明年推出 屏幕最大升级至6.7寸
  5. python创建应用程序窗口_如何设置pythonwxwidgets应用程序窗口的类名?
  6. Python监视进程创建情况和系统服务状态
  7. linux中gtk下定义label颜色,设置GtkLabel的背景颜色和字体颜色
  8. cpu使用率_单片机里面的CPU使用率是什么鬼?
  9. C语言:字符数组赋值
  10. maven项目包导不进去_IntelliJ Idea下Maven插件使用技巧