Mysql篇之架构设计

Mysql是我们在日常开发中最常使用的一种数据库,当我们利用Mysql实现各种业务增删改查时,都是将其当做一个黑盒在使用,我们的系统只需要从数据库的连接池中获取一个连接就可以执行sql工作。执行一条insert语句,表里会多出来一条数据;执行一条select语句,就能从表里找出满足条件的数据。至于这个过程是怎么实现的,对我们来说,底层的事情都交给了数据库,内部工作和运行机制完全透明,以至于在学校学了一个学期的数据库课程,只学到了表层和皮毛,以为会写超长复杂的Sql语句就算掌握了数据库,直到进入职场被面试官吊打,在面对线上超大数据体量的Sql优化时两眼懵逼,我们对数据库的了解还太少,底层原理和深层优化有待提升,因此在这里开一个Mysql专题进行爆肝与死磕,将学习心得与总结和大家共享。

一. Mysql的架构设计


1.连接器

Mysql作为服务器,一个客户端的Sql连接过来就需要分配一个线程进行处理,这个线程会专门负责监听请求并读取数据。这部分的线程和连接管理都是有一个连接器,专门负责跟客户端建立连接、权限认证、维持和管理连接。

2.解析器

SQL解析,就是按照SQL语法,把我们编写的SQL语句进行词法分析,理解这个SQL需要做什么事情,比如如下SQL语句,就会被解析器给拆成三步逻辑:

  • 查询user表;
  • 寻找到userId=007的那条数据;
  • 将数据中的name、age、country字段信息提取出来;
select name,age,country from user where userId=007;

3.优化器

当解析器把SQL语句解析出来步骤以后,紧接着会通过优化器来选择一个最优的查询路径,这个是对于我们编写的超大型复杂SQL时十分有用,一条SQL语句可能会对应多个不同的查询路径树,优化器会从中选择一个最优路径出来,返回一个这个语句的执行方案交给下一步进行继续处理。

4.执行器

这一步就是根据上一步骤优化器生成的SQL执行方案,去调用存储引擎的接口(InnoDB、mysam)完成SQL语句的执行计划,这个SQL引擎操作的有可能是内存数据,也有可能是磁盘文件。

于是把上面一条SQL语句的执行抽取出来形成下面这个Mysql的逻辑架构图:

Mysq架构设计

补充:MySQL 8.0 版本直接将查询缓存的整块功能删掉了,日常也不建议开启使用。

二. InnoDB存储引擎设计

上面流程介绍了一条SQL语句在数据库中的执行流程,当SQL执行到存储引擎这里,因为不同的引擎的实现机制有所不同,现在就以使用最广泛的为InnoDB引擎再来细化说明Innodb在数据查询和更新流程的细节。

1. 内存缓冲池

InnoDB中有一个非常重要的内存组件——缓冲池(Buffer Pool),这里会缓存很多数据便于查询时,直接从读取缓存数据,而不需要访问磁盘。在执行更新操作时,如对“id=007”数据进行更新,会先查询BufferPool中是否存在,不存在的话,就从磁盘中加载到缓冲池中来,然后还要对这行记录加独占锁。

2.undo日志

如果执行一个更新语句,且这个语句还在事务里的话,在事务提交以前,我们都可以选择回滚,而这部分回滚的数据,就是未更新以前的数据,它是保存在undo日志里的。

3.redo日志

在更新操作时,会先更新Buffer Pool中的数据然后再去操作磁盘,但是在极端情况下会出现系统宕机或者断电导致磁盘还未更新就丢失了数据,此时需要把对内存所做的修改写入到一个redo log buffer里去,这里也是一个内存缓冲区,用于存放redo日志的。在事务提交策略上,有一个关键配置:

innodb_flush_log_at_trx_commit=1

commit=0时,事务提交成功,redo buffer不会写入redo log
commit=1时,只要事务提交成功,redo buffer一定会写入redo log(推荐)
commit=2时,事务提交成功,redo buffer先写入os cache,然后过段时间才刷入redo log

采用了commit=1的配置,就能保证提交事务的时候,redo日志会刷入磁盘,数据不丢失。

4.binlog日志

前面说的redo日志是偏向物理性质的日志,记录的是对数据页中某一个数据进行了什么修改,和引擎有关。而Binlog日志则偏向于逻辑层面的一个归档日志,记录的是对表中某行数据做了什么操作,且修改后的值为多少,是Mysql Server自己的日志文件。

binlog日志的落盘是在上面redo日志落盘以后才会去执行的,而且落盘策略也是可以选择直接刷盘还是先刷到OS cache中,这个配置项取决于sync_binlog。sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘,这样可以保证 MySQL 异常重启之后 binlog 不丢失(一般都推荐这个值)。当Mysql把binlog写入了磁盘文件以后,就完成了最终的事务提交,这次提交就会把本次更新对应的binlog文件名+binlog的位置都写入redo log的日志文件中,并同时写入一个commit标记。到这里,才最终完成了一次事务的提交,总的一个流程图如下:

5.IO线程随机刷盘

当事务提交完毕以后,所有的日志文件都已经更新到最新了,此时系统不惧任何宕机断电行为了,后台的IO线程会随机把内存中的那个更新后的脏数据刷入到磁盘文件中,此时内存和磁盘中的数据已经保持一致。

更新流程

核心总结


基于InnoDB的数据更新做一个流程总结如下:

  • 1、加载磁盘文件到buffer Pool中;
  • 2、更新数据之前,写入旧数据到undo日志,便于回退;
  • 3、更新内存中的buffer pool数据;
  • 4、将更新部分的redo log写入到redo log buffer中;
  • 5、redo日志刷入磁盘
  • 6、binlog日志刷入磁盘
  • 7、将binlog文件和位置写入到redo日志文件中,并写入commit。
  • 8、后台的IO线程某个时间随机将buffer pool中的脏数据同步到磁盘文件。

InnoDB引擎中主要就是包含了buffer pool、redo log buffer等内存数据,同时也包含了undo日志、redo日志等磁盘文件数据,另外Mysql也会有自己的binlog日志。buffer pool是Mysql里面的一个核心内存组件,所有的增删改查操作都是针对buffer pool来进行的,然后才是去配合写undo、redo、binlog等操作,这些都是组件的设计既可以用于提高数据库的并发性能,同时更重要的可以设计保证事务的四个特性(ACID),譬如redo日志可以保证持久性,undo可以用于回滚保证原子性等等。这一节就到这里,后面一节的会重点安排一下InnoDB索引及数据结构的内容。

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