MySQL架构设计--InnoDB存储引擎

1. sql操作流程图


2. 流程图解析

1)前台操作触发mysql服务器执行请求

前台用户各种操作触发mysql执行,通过web项目中自带的数据库连接池:dbcp、c3p0、druid等,与数据库服务器建立网络连接

数据库连接池中的线程监听到请求后,将接收到的sql语句通过sql接口响应给查询解析器,查询解析器按照sql语法解析出查询哪些表的哪个字段,查询条件是啥;再通过查询优化器处理,选择该sql最优的一套执行计划,然后执行器负责调用存储引擎的一系列接口,执行该计划完成整个sql语句的执行


2)InnoDB存储引擎-缓冲池完成基本更新操作

具体执行这些执行计划得要存储引擎来完成,如图所示,首次更新user表中id=10的这条数据,缓冲池一开始肯定没有该条数据的,得要先从磁盘中将被更新的原始数据加载到缓冲池中

同时为了保证并发更新数据安全问题,会对这条数据先加锁,防止其他事务更新

接着将更新前的值先备份到undo log 中,便于回滚

最后更新缓存页中的数据为最新的数据,至此就完成了在缓冲池中的执行流程


3)Redo Log 和 BinLog保证事务的可靠性

缓冲池中更新完数据后,需要将本次更新的数据顺序写到redo log和bin log日志中(此时信息还在内存中,后续的刷盘策略如图所示),一般为了保证数据不丢失会配置双写策略,redo log 落盘后,写bin log 落盘,再将bin log 的文件名、文件所在路径信息以及commit标记同步顺序写到redo log中(其中以commit标记是否更新到redo log中,是判定事务是否提交成功的一个重要标准),redo log和bin log分别在物理和逻辑层面为本次事务、提供数据上的一致性保障,如图


4)将事务的操作持久化

前面的一系列操作后,InnoDB存储引擎后台还有一个IO线程,会在数据库压力的低峰期间,将缓冲池中被事务更新、但还没来得及写到磁盘中的数据(脏数据,因为磁盘数据和内存数据已经不一致了)给刷到磁盘中,完成事务的持久化,如图


3. buffer pool


1)内存结构

查询参数:innodb_buffer_pool_size,默认大小128M。

注意:buffer pool中缓存页对应磁盘中的数据页,另外还有一块内存关于数据的描述信息,大概是数据页的5%左右, 800字节左右,所以一块buffer pool实际内存要比128M大一点。

2)3大链表

l free链表

buffer pool中并没有单独开辟空间来维护free链表,而是在 描述数据 中维护着两个指针,free_pre和free_next,分别向上一个free链表的节点,和下一个free链表的节点,构成了free链表。

数据加载到buffer pool中的缓存页中,把free链表上对那个的缓存页节点删除掉。

判断数据有没有加载到buffer pool中,还需要引入数据库自己维护的hash表数据结构,会用 表空间号+数据页号,作为一个key,缓存页的地址作为value。

l flush链表

数据结构同free链表,用于刷脏,脏数据指的是缓存页中增删改的数据,把flush链表上的缓存页数据刷到磁盘

避免每次刷盘都刷整个buffer pool中所有数据。

数据刷入磁盘之后,该缓存页从flush链表上移除,重新添加到free链表上。

l lru链表(least recently used)

数据结构同free链表,记录着缓存页数据被操作的命中率,如果一个缓存页的数据经常被执行增删改操作,称之为高命中,排在链表头部,相反则排在尾部。

一条数据被操作的时候,该缓存页会被提升到lru链表的头部。

如果缓存页不够的话,会把lru尾部不常操作的数据刷入到磁盘,重新把缓存页添加到free链表中。

注意:由于mysql的预读机制和全表扫描,经常会把相邻的数据页和整个表的数据页加载到buffer pool中,引起的问题就是根本不会操作的数据占据了lru链表比较靠前的位置,而可能操作的数据被挤到了尾部,从而造成了尾部数据重新加载。


lru链表优化


参数:冷热数据比例innodb_old_blocks_pct 默认37

      冷区数据移动到热区数据的时间阈值innodb_old_blocks_time 默认1000毫秒

4. undo log

buffer pool中更新事务未提交的数据,mysql就宕机了,此时数据就需要回滚到未更新之前的状态,引入了undo log,记录了当前事务操作的逆向操作(也就是操作之前的数据),保证事务失败后数据的回滚。

在磁盘数据页加载到buffer pool中缓存页之后,数据更新之前,把逆向日志记录到redo log中。

5. redo log


buffer pool中更新事务提交的数据,如果还没来得及刷入磁盘,就断电了,这时候的数据在内存中,断掉就丢失了;所以引入了redo log机制,保证事务提交的时候,以日志的形式记录到redo log文件中,此时断电,重启后只需要把之前的事务根据redo log重做一次就好,保证事务提交的数据不丢失。

而且redo log采取的是日志追加的顺序写,性能比刷盘的随机写高很多。

redo log格式:--日志类型+表空间号+数据页号+偏移量+修改几个字节的值+具体的值。

注意:redo log 并不是一条一条的追加,而是引入了redo log block的数据结构,512k,类似于字节流设置多少字节操作一次一样;mysql启动的时候就会在buffer pool中申请一个redo log buffer空间用来存放redo log block,默认16M。

redo log buffer何时刷盘呢?

1)redo log buffer 写入的数据超过了总空间的一半

2)Innodb_flush_log_at_trx参数控制事务提交后的几种刷盘策略

3)后台线程每隔1s刷盘一次

4)mysql关闭的时候

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

推荐阅读更多精彩内容