MySql技术内幕-InnoDB存储引擎(二)

InnoDB体系架构

InnoDB的存储引擎体系结构如下图所示,从图中可知,InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作:
1.维护所有进程/线程需要访问的多个内存数据结构
2.缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存
3.重做日志(redo log)缓冲
。。。


InnoDB体系架构.png

后台线程

InnoDB存储引擎是多线程的模型,因此后台有多个不同的后台线程,负责处理不同的任务。
1.Master Thread
Master Thread主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新,合并插入缓冲(INSERT BUFFER),UNDO页的回收。

2.IO Thread
在InnoDB存储引擎中大量使用了AIO(Async IO)来处理写IO请求,这样可以极大提高数据库的性能。IO Thread主要负责这些IO请求的回调处理。从InnoDB 1.0.X版本开始,一共有10个线程,4个read thread和4个write thread和insert buffer 和log IO thread。
可以通过show variables like 'innodb_version'查看innodb引擎版本号。
可以通过show variables like 'innodb_%_threads'查看线程数量。
可以通过show engine innodb status来观察InnoDB中的IO Thread。

3.Purge Thread
事务被提交后,其所使用的undolog可能不在需要,因此需要Purge Thread来回收已经使用并分批的undo页。从InnoDB 1.2开始,支持多个Purge Thread,这样做可以进一步加快undo页的回收。
可以在MySQL数据库的配置文件中添加如下命令来启用独立的Purge Thread:
[mysqld]
innodb_purge_threads=1

4.Page Cleaner Thread
Page Cleaner Thread的作用是将之前版本中的脏页的刷新操作都放入到单独的线程中完成。其目的是对于用户查询线程的阻塞,进一步提高存储引擎新能。

内存

!内存数据对象.png

1.缓冲池
InnoDB存储引擎是基于磁盘存储的。基于磁盘的数据库通常使用缓冲池技术老提供数据库的新能。缓冲池简单的来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。
在数据库中进行读取页的操作时,首先将磁盘读到的页存放在缓冲池中,下一次在读心相同页时,首先判断该页是否在缓冲池中,若在,则称该页在缓冲池中被命中,直接读取该页。否则从磁盘上读取。在数据库中进行修改页操作时,首先修改缓冲池中的页,再以一定频率刷到磁盘上。页从缓冲池刷新回磁盘的操作并不是每次更新时触发,而是通过Checkpoint的机制刷新回磁盘。
综上所述,缓冲池的大小直接影响数据库的性能。由于32位系统的限制,强烈建议数据库服务器采用64位操作系统。可以通过innodb_buffer_pool_size来设置缓冲池大小,也可以通过innodb_buffer_pool_instances来配置多个缓冲池实例。

2.LRU List,Free List,Flush List
LRU List--数据库缓冲池通过LRU(Last Recent Used,最近最少使用)算法进行管理,缓冲池中的页的大小默认16KB。InnoDB对传统的LRU算法进行了优化,加入了midpoint。传统的LRU算法当访问到的页不在缓冲区是直接将磁盘页数据调到缓冲区队列;而InnoDB并不是直接插入到缓冲区队列的队头,而是插入LRU列表的midpoint位置。这个算法称之为midpoint insertion stategy。默认配置在列表长度的5/8处。midpoint由参数innodb_old_blocks_pct控制。midpoint之前的列表称之为new列表,之后的列表称之为old列表。可以简单的将new列表中的页理解为最为活跃的热点数据。

Free List--数据库刚启动时,LRU 列表为空。这时页都存在Free列表中,当需要从缓冲池中分页时,首先从Free列表中查找可用的空闲页,若有则将Free列表中的页删除,放入LRU列表中。否则根据LRU算法,淘汰LRU列表末尾页,将改内存空间分配给新的页。

Flush List--当LRU列表中的页被修改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页数据产生了不一致。这时候数据库会通过checkpoint机制将脏页刷新回磁盘,而Flush 列表中的页即为脏页列表。注意脏页即存在于LRU列表中,也存在Flush列表中。

3.重做日志缓冲
InnoDB存储引擎先将重做日志信息放入重做日志缓冲区,然后按一定频率将其刷新到重做日志文件。该值可以通过innodb_log_buffer_size控制,默认8MB。一般情况下足以满足绝大部分的应用。

4.额外的内存池
InnoDB存储引擎中,对内存的管理是通过内存堆的方式进行的。在对一些数据结构本身的内存进行分配时,需要从二娃的内存池中申请,当该区域内存不够时,会从缓冲池中申请。

Checkpoint技术

Checkpoint技术的目的是解决如下几个问题:
1.缩短数据库的恢复时间
2.缓冲池不够用时,将脏页刷新到磁盘
3.重做日志不可用时,刷新脏页

InnoDB存储引擎中,有两种Checkpoint:
1.Sharp Checkpoint--发生在数据库关闭时将所有的脏页都刷新会磁盘,默认的工作方式,即参数innodb_fast_shutdown=1
2.Fuzzy Checkpoint--数据库运行时,刷新一部分脏页回磁盘,而不是刷新所有脏页回磁盘

Fuzzy Checkpoint又有如下几种情况:
1.Master Thread Checkpoint --差不多以每秒或每十秒的速度从缓冲池的脏页列表刷新一定比例的页回磁盘,异步。
2.FLUSH_LRU_LIST Checkpoint --保证LRU列表中需要差不多100个空闲页可以试用,5.6版本后可以通过innodb_lru_scan_depth控制LRU列表中可用页的数量,5.6版本开始异步。
3.Async/Sync Flush Checkpoint --重做日志文件不可用的情况,需要强制将一些页刷新回磁盘,此时脏页从脏页列表中选取,5.6版本开始异步。
4.Dirty Page too much --脏页太多,引擎强制进行checkpoint。目的是保证缓冲池有足够可用的页,可由参赛innodb_max_dirty_pages_pct控制,默认75。

Master Thread工作方式

伪代码和理解详见书本,或以后单独一章节记录

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容