您的位置:首页 > 起名

谢俞玩自己被贺朝发现微博(我五行缺你车)

谢俞玩自己被贺朝发现微博(我五行缺你车)

五行缺车|一手大牌却不按常理出牌

上汽名爵锐腾,有一身大牌的它从不按常理出牌。

在几乎所有SUV产品都极力地在外观内饰方面大做文章的情况下,锐腾便以高性能、高颜值和高价值的“三高实力”刷新同级性能上限,八秒破百、38米刹停如跑车般帅气的造型在同级车型中坐稳了性能第一的位子。

而全新名爵锐腾经过20个月但升级改造,又是一番脱胎换骨,焕然一新,凭借着5个“2”奠定了性能第一的领导力:发动机领先2代、百公里加速快2秒、百公里油耗省2升、刹车距离短2米、支持2种手机智能互联。简直可以称之为国产品牌SUV阵营的队长!!并且不光是性能第一,更是性能价格比第一!!

稳健 扎实 全新运动型SUV整车设计

承袭英伦设计美学,全新名爵GS,再度登场。在流面切割造型的基础上,优化视觉比例,令整车重心扎实稳健。每一处细节都精雕细琢,彰显高品质运动型SUV风范。

强壮 矫健 全新一体化尾部造型

传承经典的尾灯与后风窗一体化造型,通过后保险杠的全新设计,再次提升力量感。

豪华 运动 全新高品质内饰

内饰品质愈加考究,从汲取飞机涡轮造型的灵感,到豪华立体软包搭配精致缝线的匠心;从一体化简约设计,到局部细节质感,全面升级为豪华包厢级的座舱享受。

全方位立体软包搭配精致缝线

做工精湛,层次饱满。采用大面积的立体软包搭配精致缝线,皮革质感搭配银色金属质感增加了英伦运动感的同时又彰显了豪华品质。

8寸高清互联超大屏

搭载互联网汽车智能系统、inkaLink智能娱乐行车系统两大智能行车系统。

豪华宽适座

超长2650mm轴距,带来更宽适的空间,大面积精致软材质包覆,营造领先同级的豪华座舱。

超高强度车身结构

高刚性车身和先进的焊接技术相辅相成,车身大量采用热成型材料,高强度及超高强度钢板比例高达74%,车身耐撞性及轻量化水平领先同级车型。

SRS全方位六安全气囊

名爵锐腾配备主副驾安全气囊、侧安全气囊以及侧气帘,全方位一体的SRS安全气囊系统为你的出行保驾护航。

1336升超大后备箱容积

后排座椅可完全放倒放平,空间扩增至最大1336升,良好的平整性及超大纵深,让搬运高尔夫球杆、自行车、滑雪板等大体积物品也变得轻而易举。

五行缺车|一手大牌却不按常理出牌

上汽名爵锐腾,有一身大牌的它从不按常理出牌。

在几乎所有SUV产品都极力地在外观内饰方面大做文章的情况下,锐腾便以高性能、高颜值和高价值的“三高实力”刷新同级性能上限,八秒破百、38米刹停如跑车般帅气的造型在同级车型中坐稳了性能第一的位子。

而全新名爵锐腾经过20个月但升级改造,又是一番脱胎换骨,焕然一新,凭借着5个“2”奠定了性能第一的领导力:发动机领先2代、百公里加速快2秒、百公里油耗省2升、刹车距离短2米、支持2种手机智能互联。简直可以称之为国产品牌SUV阵营的队长!!并且不光是性能第一,更是性能价格比第一!!

稳健 扎实 全新运动型SUV整车设计

承袭英伦设计美学,全新名爵GS,再度登场。在流面切割造型的基础上,优化视觉比例,令整车重心扎实稳健。每一处细节都精雕细琢,彰显高品质运动型SUV风范。

强壮 矫健 全新一体化尾部造型

传承经典的尾灯与后风窗一体化造型,通过后保险杠的全新设计,再次提升力量感。

豪华 运动 全新高品质内饰

内饰品质愈加考究,从汲取飞机涡轮造型的灵感,到豪华立体软包搭配精致缝线的匠心;从一体化简约设计,到局部细节质感,全面升级为豪华包厢级的座舱享受。

全方位立体软包搭配精致缝线

做工精湛,层次饱满。采用大面积的立体软包搭配精致缝线,皮革质感搭配银色金属质感增加了英伦运动感的同时又彰显了豪华品质。

8寸高清互联超大屏

搭载互联网汽车智能系统、inkaLink智能娱乐行车系统两大智能行车系统。

豪华宽适座

超长2650mm轴距,带来更宽适的空间,大面积精致软材质包覆,营造领先同级的豪华座舱。

超高强度车身结构

高刚性车身和先进的焊接技术相辅相成,车身大量采用热成型材料,高强度及超高强度钢板比例高达74%,车身耐撞性及轻量化水平领先同级车型。

SRS全方位六安全气囊

名爵锐腾配备主副驾安全气囊、侧安全气囊以及侧气帘,全方位一体的SRS安全气囊系统为你的出行保驾护航。

1336升超大后备箱容积

后排座椅可完全放倒放平,空间扩增至最大1336升,良好的平整性及超大纵深,让搬运高尔夫球杆、自行车、滑雪板等大体积物品也变得轻而易举。

荐书《我五行缺你》林逐水对周嘉鱼说,看你手相,你是我未来老婆

这本是西子绪的风水玄幻小说,主角是周嘉鱼跟林逐水,一句话简介是:看你手相,你是我未来老婆。一本关于风水抓鬼除妖的风水玄幻的题材,写得这么浅显易懂又很带感的,西子绪在这方面还是很厉害的。这本的情节原本是《为了和谐而奋斗》的其中一个单元篇章,后来扩写成为《我五行缺你》。

《我五行缺你》讲的是风水灵异世界里的故事,周嘉鱼原本是一个勤勤恳恳的公务员,但有一天不小心死了还穿越到一个神棍骗子周嘉鱼的身上,更惨的是,还是一个被风水大师林逐水抓住的场景,并且脑子里还有一只灵鸟,也因此被灵鸟救了一命,最后成功留在了林逐水的身边,成为一名不是徒弟的弟子。

这一本完结只有113章,不长,但内容还是很丰富的。林逐水是风水大家林家的天才,但也因为命格过强,所以非常寡情,手下有四个弟子,分别是一穷、二白、朝三、慕四。周嘉鱼这个假骗子原本不受待见,但因为一手好厨艺,最终成功成为了这个小团体。无论什么时代,拥有一门好手艺还是非常重要的,就算不小心穿越了还能救自己一命。

从此周嘉鱼就跟着林逐水一起踏上了这条斩妖除魔的正道,遇见的各种风水怪阵以及邪恶人心。印象很深的是选弟子,用的翡翠赌石的方式,对着毛料感应出种水最好的翡翠原料,开出来的翡翠质量越好,就证明跟风水这一行的缘分越深。这个细节跟我看的另外一本《叔,你命中缺我》的其中一个篇章都是一样写法。

书中有一个篇章是关于仿真娃娃的,因为做娃娃从而相爱的两个艺术家,最终却也因为娃娃而变成怨侣,而娃娃回来复仇的情节也是描写得十分吓人,加上周嘉鱼超强的共情能力,情节重现的一幕还是令人感到恐惧。

那场考验中最后是去到了一个偏僻的小山村,原本以为都是好人的村子,没想到全员恶人,让周嘉鱼他们差点就回不来了。人们对于天才的观感就像是异类,人心的险恶也令人唏嘘。但最终还是真善美值得留恋。

另外一个记忆很深刻的情节是一只槐树精想要复活他心爱之人,被坏人利用做了很多坏事,还藏了不好的东西在大桥底下,以至于不断发生祸事。那一对百合求助了周嘉鱼才最终揭破这个谜团,每夜十二点都定时过去大桥的情节,想象力丰富一点都觉得异常吓人。

​布了那么大一个局,其实就是为了追求长生不老,追求绝对的权利,也是想要林逐水的修为命格。但为了救林逐水,周嘉鱼最后舍弃了自己的性命,从而挽救了他。到了故事的最后,林逐水原本生无可恋,但发现了周嘉鱼原来是穿越之身,等了许久找了许久,满头白发的他终于重遇了他的周嘉鱼。

荐书《我五行缺你》林逐水对周嘉鱼说,看你手相,你是我未来老婆

这本是西子绪的风水玄幻小说,主角是周嘉鱼跟林逐水,一句话简介是:看你手相,你是我未来老婆。一本关于风水抓鬼除妖的风水玄幻的题材,写得这么浅显易懂又很带感的,西子绪在这方面还是很厉害的。这本的情节原本是《为了和谐而奋斗》的其中一个单元篇章,后来扩写成为《我五行缺你》。

《我五行缺你》讲的是风水灵异世界里的故事,周嘉鱼原本是一个勤勤恳恳的公务员,但有一天不小心死了还穿越到一个神棍骗子周嘉鱼的身上,更惨的是,还是一个被风水大师林逐水抓住的场景,并且脑子里还有一只灵鸟,也因此被灵鸟救了一命,最后成功留在了林逐水的身边,成为一名不是徒弟的弟子。

这一本完结只有113章,不长,但内容还是很丰富的。林逐水是风水大家林家的天才,但也因为命格过强,所以非常寡情,手下有四个弟子,分别是一穷、二白、朝三、慕四。周嘉鱼这个假骗子原本不受待见,但因为一手好厨艺,最终成功成为了这个小团体。无论什么时代,拥有一门好手艺还是非常重要的,就算不小心穿越了还能救自己一命。

从此周嘉鱼就跟着林逐水一起踏上了这条斩妖除魔的正道,遇见的各种风水怪阵以及邪恶人心。印象很深的是选弟子,用的翡翠赌石的方式,对着毛料感应出种水最好的翡翠原料,开出来的翡翠质量越好,就证明跟风水这一行的缘分越深。这个细节跟我看的另外一本《叔,你命中缺我》的其中一个篇章都是一样写法。

书中有一个篇章是关于仿真娃娃的,因为做娃娃从而相爱的两个艺术家,最终却也因为娃娃而变成怨侣,而娃娃回来复仇的情节也是描写得十分吓人,加上周嘉鱼超强的共情能力,情节重现的一幕还是令人感到恐惧。

那场考验中最后是去到了一个偏僻的小山村,原本以为都是好人的村子,没想到全员恶人,让周嘉鱼他们差点就回不来了。人们对于天才的观感就像是异类,人心的险恶也令人唏嘘。但最终还是真善美值得留恋。

另外一个记忆很深刻的情节是一只槐树精想要复活他心爱之人,被坏人利用做了很多坏事,还藏了不好的东西在大桥底下,以至于不断发生祸事。那一对百合求助了周嘉鱼才最终揭破这个谜团,每夜十二点都定时过去大桥的情节,想象力丰富一点都觉得异常吓人。

​布了那么大一个局,其实就是为了追求长生不老,追求绝对的权利,也是想要林逐水的修为命格。但为了救林逐水,周嘉鱼最后舍弃了自己的性命,从而挽救了他。到了故事的最后,林逐水原本生无可恋,但发现了周嘉鱼原来是穿越之身,等了许久找了许久,满头白发的他终于重遇了他的周嘉鱼。

超干货!为了让你彻底弄懂 MySQL 事务日志,我通宵搞出了这份图解

作者 | Amazing10

责编 | 屠敏

本文为业余码农投稿,已获授权

还记得刚上研究生的时候,导师常挂在嘴边的一句话,“科研的基础不过就是数据而已。”如今看来,无论是人文社科,还是自然科学,或许都可在一定程度上看作是数据的科学。

倘若剥开研究领域的外衣,将人的操作抽象出来,那么科研的过程大概就是根据数据流动探索其中的未知信息吧。当然科学研究的范畴涵盖甚广,也不是一两句话能够拎得清的。不过从这个角度上的阐述,也只是为了引出数据的重要性。

在当今社会,充斥着大量的数据。从众多APP上的账户资料到银行信用体系等个人档案,都离不开对大量数据的组织、存储和管理。而这,便是数据库存在的目的和价值。

目前数据库的类型主要分为两种,一种是关系型数据库,另一种是非关系型数据库(NoSQL)。而我们今天的主角MySQL就是关系型数据库中的一种。

本文结构

关系型数据库与NoSQL

关系型数据库,顾名思义,是指存储的数据之间具有关系。这种所谓的关系通常用二维表格中的行列来表示,即一个二维表的逻辑结构能够反映表中数据的存储关系。

概念总是拗口难懂的。那么简单来说,关系型数据库的存储就是按照表格进行的。数据的存储实际上就是对一个或者多个表格的存储。通过对这些表格进行分类、合并、连接或者选取等运算来实现对数据库的管理。常见的关系型数据库有MySQL、Oracle、DB2和SqlServer等。

非关系型数据库(NoSQL)是相对于关系型数据库的一种泛指,它的特点是去掉了关系型数据库中的关系特性,从而可获得更好的扩展性。NoSQL并没有严格的存储方式,但采用不同的存储结构都是为了获得更高的性能和更高的并发。

NoSQL根据存储方式可分为四大类,键值存储数据库、列存储数据库、文档型数据库和图形数据库。这四种数据的存储原理不尽相同,因而在应用场景上也有些许的差异。一般常用的有作为数据缓存的redis和分布式系统的HBase。目前常见的数据库排名可见网站:

/d/file/gt/2023-12/fh21cbeupe4 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL数据库具有以下几个方面的优势:

体积小、速度快;

代码开源,采用了 GPL 协议,可以修改源码来开发自己的 MySQL 系统;

支持大型的数据库,可以处理拥有上千万条记录的大型数据库;

使用标准的 SQL 数据语言形式,并采用优化的 SQL 查询算法,有效地提高查询速度;

使用 C 和 C++ 编写,并使用多种编译器进行测试,保证源代码的可移植性;

可运行在多个系统上,并且支持多种语言;

核心程序采用完全的多线程编程,可以灵活地为用户提供服务,充分利用CPU资源。

逻辑架构

MySQL的逻辑架构可分为四层,包括连接层、服务层、引擎层和存储层,各层的接口交互及作用如下图所示。需要注意的是,由于本文将主要讲解事务的实现原理,因此下文针对的都是InnoDB引擎下的情况。

连接层: 负责处理客户端的连接以及权限的认证。

服务层: 定义有许多不同的模块,包括权限判断,SQL接口,SQL解析,SQL分析优化, 缓存查询的处理以及部分内置函数执行等。MySQL的查询语句在服务层内进行解析、优化、缓存以及内置函数的实现和存储。

引擎层: 负责MySQL中数据的存储和提取。MySQL中的服务器层不管理事务,事务是由存储引擎实现的。其中使用最为广泛的存储引擎为InnoDB,其它的引擎都不支持事务。

存储层: 负责将数据存储于设备的文件系统中。

MySQL的逻辑架构

MySQL事务

事务是MySQL区别于NoSQL的重要特征,是保证关系型数据库数据一致性的关键技术。事务可看作是对数据库操作的基本执行单元,可能包含一个或者多个SQL语句。这些语句在执行时,要么都执行,要么都不执行。

事务的执行主要包括两个操作,提交和回滚。

提交:commit,将事务执行结果写入数据库。

回滚:rollback,回滚所有已经执行的语句,返回修改之前的数据。

MySQL事务包含四个特性,号称ACID四大天王。

原子性(Atomicity) :语句要么全执行,要么全不执行,是事务最核心的特性,事务本身就是以原子性来定义的;实现主要基于undo log日志实现的。

持久性(Durability :保证事务提交后不会因为宕机等原因导致数据丢失;实现主要基于redo log日志。

隔离性(Isolation) :保证事务执行尽可能不受其他事务影响;InnoDB默认的隔离级别是RR,RR的实现主要基于锁机制、数据的隐藏列、undo log和类next-key lock机制。

一致性(Consistency) :事务追求的最终目标,一致性的实现既需要数据库层面的保障,也需要应用层面的保障。

原子性

事务的原子性就如原子操作一般,表示事务不可再分,其中的操作要么都做,要么都不做;如果事务中一个SQL语句执行失败,则已执行的语句也必须回滚,数据库退回到事务前的状态。只有0和1,没有其它值。

事务的原子性表明事务就是一个整体,当事务无法成功执行的时候,需要将事务中已经执行过的语句全部回滚,使得数据库回归到最初未开始事务的状态。

事务的原子性就是通过undo log日志进行实现的。当事务需要进行回滚时,InnoDB引擎就会调用undo log日志进行SQL语句的撤销,实现数据的回滚。

持久性

事务的持久性是指当事务提交之后,数据库的改变就应该是永久性的,而不是暂时的。这也就是说,当事务提交之后,任何其它操作甚至是系统的宕机故障都不会对原来事务的执行结果产生影响。

事务的持久性是通过InnoDB存储引擎中的redo log日志来实现的,具体实现思路见下文。

隔离性

原子性和持久性是单个事务本身层面的性质,而隔离性是指事务之间应该保持的关系。隔离性要求不同事务之间的影响是互不干扰的,一个事务的操作与其它事务是相互隔离的。

由于事务可能并不只包含一条SQL语句,所以在事务的执行期间很有可能会有其它事务开始执行。因此多事务的并发性就要求事务之间的操作是相互隔离的。这一点跟多线程之间数据同步的概念有些类似。

锁机制

事务之间的隔离,是通过锁机制实现的。当一个事务需要对数据库中的某行数据进行修改时,需要先给数据加锁;加了锁的数据,其它事务是不运行操作的,只能等待当前事务提交或回滚将锁释放。

锁机制并不是一个陌生的概念,在许多场景中都会利用到不同实现的锁对数据进行保护和同步。而在MySQL中,根据不同的划分标准,还可将锁分为不同的种类。

按照粒度划分:行锁、表锁、页锁

按照使用方式划分:共享锁、排它锁

按照思想划分:悲观锁、乐观锁

锁机制的知识点很多,由于篇幅不好全部展开讲。这里对按照粒度划分的锁进行简单介绍。

粒度:指数据仓库的数据单位中保存数据的细化或综合程度的级别。细化程度越高,粒度级就越小;相反,细化程度越低,粒度级就越大。

MySQL按照锁的粒度划分可以分为行锁、表锁和页锁。

行锁:粒度最小的锁,表示只针对当前操作的行进行加锁;

表锁:粒度最大的锁,表示当前的操作对整张表加锁;

页锁:粒度介于行级锁和表级锁中间的一种锁,表示对页进行加锁。

这三种锁是在不同层次上对数据进行锁定,由于粒度的不同,其带来的好处和劣势也不一而同。

表锁在操作数据时会锁定整张表,因而并发性能较差;

行锁则只锁定需要操作的数据,并发性能好。但是由于加锁本身需要消耗资源(获得锁、检查锁、释放锁等都需要消耗资源),因此在锁定数据较多情况下使用表锁可以节省大量资源。

MySQL中不同的存储引擎能够支持的锁也是不一样的。MyIsam只支持表锁,而InnoDB同时支持表锁和行锁,且出于性能考虑,绝大多数情况下使用的都是行锁。

并发读写问题

在并发情况下,MySQL的同时读写可能会导致三类问题,脏读、不可重复度和幻读。

(1)脏读:当前事务中读到其他事务未提交的数据,也就是脏数据。

以上图为例,事务A在读取文章的阅读量时,读取到了事务B为提交的数据。如果事务B最后没有顺利提交,导致事务回滚,那么实际上阅读量并没有修改成功,而事务A却是读到的修改后的值,显然不合情理。

(2)不可重复读:在事务A中先后两次读取同一个数据,但是两次读取的结果不一样。脏读与不可重复读的区别在于:前者读到的是其他事务未提交的数据,后者读到的是其他事务已提交的数据。

以上图为例,事务A在先后读取文章阅读量的数据时,结果却不一样。说明事务A在执行的过程中,阅读量的值被其它事务给修改了。这样使得数据的查询结果不再可靠,同样也不合实际。

(3)幻读:在事务A中按照某个条件先后两次查询数据库,两次查询结果的行数不同,这种现象称为幻读。不可重复读与幻读的区别可以通俗的理解为:前者是数据变了,后者是数据的行数变了。

以上图为例,当对0<阅读量<100的文章进行查询时,先查到了一个结果,后来查询到了两个结果。这表明同一个事务的查询结果数不一,行数不一致。这样的问题使得在根据某些条件对数据筛选的时候,前后筛选结果不具有可靠性。

隔离级别

根据上面这三种问题,产生了四种隔离级别,表明数据库不同程度的隔离性质。

在实际的数据库设计中,隔离级别越高,导致数据库的并发效率会越低;而隔离级别太低,又会导致数据库在读写过程中会遇到各种乱七八糟的问题。

因此在大多数数据库系统中,默认的隔离级别时读已提交(如Oracle)或者可重复读RR(MySQL的InnoDB引擎)。

MVCC

又是一个难嚼的大块头。MVCC就是用来实现上面的第三个隔离级别,可重复读RR。

MVCC:Multi-Version Concurrency Control,即多版本的并发控制协议。

MVCC的特点就是在同一时刻,不同事务可以读取到不同版本的数据,从而可以解决脏读和不可重复读的问题。

MVCC实际上就是通过数据的隐藏列和回滚日志(undo log),实现多个版本数据的共存。这样的好处是,使用MVCC进行读数据的时候,不用加锁,从而避免了同时读写的冲突。

在实现MVCC时,每一行的数据中会额外保存几个隐藏的列,比如当前行创建时的版本号和删除时间和指向undo log的回滚指针。这里的版本号并不是实际的时间值,而是系统版本号。每开始新的事务,系统版本号都会自动递增。事务开始时的系统版本号会作为事务的版本号,用来和查询每行记录的版本号进行比较。

每个事务又有自己的版本号,这样事务内执行数据操作时,就通过版本号的比较来达到数据版本控制的目的。

另外,InnoDB实现的隔离级别RR时可以避免幻读现象的,这是通过next-key lock机制实现的。

next-key lock实际上就是行锁的一种,只不过它不只是会锁住当前行记录的本身,还会锁定一个范围。比如上面幻读的例子,开始查询0<阅读量<100的文章时,只查到了一个结果。next-key lock会将查询出的这一行进行锁定,同时还会对0<阅读量<100这个范围进行加锁,这实际上是一种间隙锁。间隙锁能够防止其他事务在这个间隙修改或者插入记录。这样一来,就保证了在0<阅读量<100这个间隙中,只存在原来的一行数据,从而避免了幻读。

间隙锁:封锁索引记录中的间隔

虽然InnoDB使用next-key lock能够避免幻读问题,但却并不是真正的可串行化隔离。再来看一个例子吧。

首先提一个问题:

在T6时间,事务A提交事务之后,猜一猜文章A和文章B的阅读量为多少?

答案是,文章AB的阅读量都被修改成了10000。这代表着事务B的提交实际上对事务A的执行产生了影响,表明两个事务之间并不是完全隔离的。虽然能够避免幻读现象,但是却没有达到可串行化的级别。

这还说明,避免脏读、不可重复读和幻读,是达到可串行化的隔离级别的必要不充分条件。可串行化是都能够避免脏读、不可重复读和幻读,但是避免脏读、不可重复读和幻读却不一定达到了可串行化。

一致性

一致性是指事务执行结束后,数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。

一致性是事务追求的最终目标,原子性、持久性和隔离性,实际上都是为了保证数据库状态的一致性而存在的。

这就不多说了吧。你细品。

MySQL日志系统

了解完MySQL的基本架构,大体上能够对MySQL的执行流程有了比较清晰的认知。接下来我将为大家介绍一下日志系统。

MySQL日志系统是数据库的重要组件,用于记录数据库的更新和修改。若数据库发生故障,可通过不同日志记录恢复数据库的原来数据。因此实际上日志系统直接决定着MySQL运行的鲁棒性和稳健性。

MySQL的日志有很多种,如二进制日志(binlog)、错误日志、查询日志、慢查询日志等,此外InnoDB存储引擎还提供了两种日志:redo log(重做日志)和undo log(回滚日志)。这里将重点针对InnoDB引擎,对重做日志、回滚日志和二进制日志这三种进行分析。

重做日志(redo log)

重做日志(redo log)是InnoDB引擎层的日志,用来记录事务操作引起数据的变化,记录的是数据页的物理修改。

重做日记的作用其实很好理解,我打个比方。数据库中数据的修改就好比你写的论文,万一哪天论文丢了怎么呢?以防这种不幸的发生,我们可以在写论文的时候,每一次修改都拿个小本本记录一下,记录什么时间对某一页进行了怎么样的修改。这就是重做日志。

InnoDB引擎对数据的更新,是先将更新记录写入redo log日志,然后会在系统空闲的时候或者是按照设定的更新策略再将日志中的内容更新到磁盘之中。这就是所谓的预写式技术(Write Ahead logging)。这种技术可以大大减少IO操作的频率,提升数据刷新的效率。

脏数据刷盘

值得注意的是,redo log日志的大小是固定的,为了能够持续不断的对更新记录进行写入,在redo log日志中设置了两个标志位置,checkpoint和write_pos,分别表示记录擦除的位置和记录写入的位置。redo log日志的数据写入示意图可见下图。

当write_pos标志到了日志结尾时,会从结尾跳至日志头部进行重新循环写入。所以redo log的逻辑结构并不是线性的,而是可看作一个圆周运动。write_pos与checkpoint中间的空间可用于写入新数据,写入和擦除都是往后推移,循环往复的。

当write_pos追上checkpoint时,表示redo log日志已经写满。这时不能继续执行新的数据库更新语句,需要停下来先删除一些记录,执行checkpoint规则腾出可写空间。

checkpoint规则:checkpoint触发后,将buffer中脏数据页和脏日志页都刷到磁盘。

脏数据:指内存中未刷到磁盘的数据。

redo log中最重要的概念就是缓冲池buffer pool,这是在内存中分配的一个区域,包含了磁盘中部分数据页的映射,作为访问数据库的缓冲。

当请求读取数据时,会先判断是否在缓冲池命中,如果未命中才会在磁盘上进行检索后放入缓冲池;

当请求写入数据时,会先写入缓冲池,缓冲池中修改的数据会定期刷新到磁盘中。这一过程也被称之为刷脏 。

因此,当数据修改时,除了修改buffer pool中的数据,还会在redo log中记录这次操作;当事务提交时,会根据redo log的记录对数据进行刷盘。如果MySQL宕机,重启时可以读取redo log中的数据,对数据库进行恢复,从而保证了事务的持久性,使得数据库获得crash-safe能力。

脏日志刷盘

除了上面提到的对于脏数据的刷盘,实际上redo log日志在记录时,为了保证日志文件的持久化,也需要经历将日志记录从内存写入到磁盘的过程。redo log日志可分为两个部分,一是存在易失性内存中的缓存日志redo log buff,二是保存在磁盘上的redo log日志文件redo log file。

为了确保每次记录都能够写入到磁盘中的日志中,每次将redo log buffer中的日志写入redo log file的过程中都会调用一次操作系统的fsync操作。

fsync函数:包含在UNIX系统头文件#include <unistd.h>中,用于同步内存中所有已修改的文件数据到储存设备。

在写入的过程中,还需要经过操作系统内核空间的os buffer。redo log日志的写入过程可见下图。

redo log日志刷盘流程

二进制日志(binlog)

二进制日志binlog是服务层的日志,还被称为归档日志。binlog主要记录数据库的变化情况,内容包括数据库所有的更新操作。所有涉及数据变动的操作,都要记录进二进制日志中。因此有了binlog可以很方便的对数据进行复制和备份,因而也常用作主从库的同步。

这里binlog所存储的内容看起来似乎与redo log很相似,但是其实不然。redo log是一种物理日志,记录的是实际上对某个数据进行了怎么样的修改;而binlog是逻辑日志,记录的是SQL语句的原始逻辑,比如”给ID=2这一行的a字段加1 \"。binlog日志中的内容是二进制的,根据日记格式参数的不同,可能基于SQL语句、基于数据本身或者二者的混合。一般常用记录的都是SQL语句。

这里的物理和逻辑的概念,我的个人理解是:

物理的日志可看作是实际数据库中数据页上的变化信息,只看重结果,而不在乎是通过“何种途径”导致了这种结果;

逻辑的日志可看作是通过了某一种方法或者操作手段导致数据发生了变化,存储的是逻辑性的操作。

同时,redo log是基于crash recovery,保证MySQL宕机后的数据恢复;而binlog是基于point-in-time recovery,保证服务器可以基于时间点对数据进行恢复,或者对数据进行备份。

事实上最开始MySQL是没有redo log日志的。因为起先MySQL是没有InnoDB引擎的,自带的引擎是MyISAM。binlog是服务层的日志,因此所有引擎都能够使用。但是光靠binlog日志只能提供归档的作用,无法提供crash-safe能力,所以InnoDB引擎就采用了学自于Oracle的技术,也就是redo log,这才拥有了crash-safe能力。这里对redo log日志和binlog日志的特点分别进行了对比:

在MySQL执行更新语句时,都会涉及到redo log日志和binlog日志的读写。一条更新语句的执行过程如下:

MySQL更新语句的执行过程

从上图可以看出,MySQL在执行更新语句的时候,在服务层进行语句的解析和执行,在引擎层进行数据的提取和存储;同时在服务层对binlog进行写入,在InnoDB内进行redo log的写入。

不仅如此,在对redo log写入时有两个阶段的提交,一是binlog写入之前prepare状态的写入,二是binlog写入之后commit状态的写入。

之所以要安排这么一个两阶段提交,自然是有它的道理的。现在我们可以假设不采用两阶段提交的方式,而是采用“单阶段”进行提交,即要么先写入redo log,后写入binlog;要么先写入binlog,后写入redo log。这两种方式的提交都会导致原先数据库的状态和被恢复后的数据库的状态不一致。

先写入redo log,后写入binlog:

在写完redo log之后,数据此时具有crash-safe能力,因此系统崩溃,数据会恢复成事务开始之前的状态。但是,若在redo log写完时候,binlog写入之前,系统发生了宕机。此时binlog没有对上面的更新语句进行保存,导致当使用binlog进行数据库的备份或者恢复时,就少了上述的更新语句。从而使得id=2这一行的数据没有被更新。

先写入binlog,后写入redo log:

写完binlog之后,所有的语句都被保存,所以通过binlog复制或恢复出来的数据库中id=2这一行的数据会被更新为a=1。但是如果在redo log写入之前,系统崩溃,那么redo log中记录的这个事务会无效,导致实际数据库中id=2这一行的数据并没有更新。

由此可见,两阶段的提交就是为了避免上述的问题,使得binlog和redo log中保存的信息是一致的。

回滚日志(undo log)

回滚日志同样也是InnoDB引擎提供的日志,顾名思义,回滚日志的作用就是对数据进行回滚。当事务对数据库进行修改,InnoDB引擎不仅会记录redo log,还会生成对应的undo log日志;如果事务执行失败或调用了rollback,导致事务需要回滚,就可以利用undo log中的信息将数据回滚到修改之前的样子。

但是undo log不redo log不一样,它属于逻辑日志。它对SQL语句执行相关的信息进行记录。当发生回滚时,InnoDB引擎会根据undo log日志中的记录做与之前相反的工作。比如对于每个数据插入操作(insert),回滚时会执行数据删除操作(delete);对于每个数据删除操作(delete),回滚时会执行数据插入操作(insert);对于每个数据更新操作(update),回滚时会执行一个相反的数据更新操作(update),把数据改回去。undo log由两个作用,一是提供回滚,二是实现MVCC。

主从复制

主从复制的概念很简单,就是从原来的数据库复制一个完全一样的数据库,原来的数据库称作主数据库,复制的数据库称为从数据库。从数据库会与主数据库进行数据同步,保持二者的数据一致性。

主从复制的原理实际上就是通过bin log日志实现的。bin log日志中保存了数据库中所有SQL语句,通过对bin log日志中SQL的复制,然后再进行语句的执行即可实现从数据库与主数据库的同步。

主从复制的过程可见下图。主从复制的过程主要是靠三个线程进行的,一个运行在主服务器中的发送线程,用于发送binlog日志到从服务器。两外两个运行在从服务器上的I/O线程和SQL线程。I/O线程用于读取主服务器发送过来的binlog日志内容,并拷贝到本地的中继日志中。SQL线程用于读取中继日志中关于数据更新的SQL语句并执行,从而实现主从库的数据一致。

主从复制原理

之所以需要实现主从复制,实际上是由实际应用场景所决定的。主从复制能够带来的好处有:

1. 通过复制实现数据的异地备份,当主数据库故障时,可切换从数据库,避免数据丢失。

2. 可实现架构的扩展,当业务量越来越大,I/O访问频率过高时,采用多库的存储,可以降低磁盘I/O访问的频率,提高单个机器的I/O性能。

3. 可实现读写分离,使数据库能支持更大的并发。

4. 实现服务器的负载均衡,通过在主服务器和从服务器之间切分处理客户查询的负荷。

总结

MySQL数据库应该算是程序员必须掌握的技术之一了。无论是项目过程中还是面试中,MySQL都是非常重要的基础知识。不过,对于MySQL来说,真的东西太多了。我在写这篇文章的时候,查阅了大量的资料,发现越看不懂的越多。还真是应了那句话:

你知道的越多,不知道的也就越多。

这篇文章着重是从理论的角度去解析MySQL基本的事务和日志系统的基本原理,我在表述的时候尽可能的避免采用实际的代码去描述。即便是这篇将近一万字+近二十副纯手工绘制的图解,也难以将MySQL的博大精深分析透彻。

但是我相信,对于初学者而言,这些理论能够让你对MySQL有一个整体的感知,让你对“何谓关系型数据库”这么一个问题有了比较清晰的认知;而对于熟练掌握MySQL的大佬来说,或许本文也能够唤醒你尘封已久的底层理论基础,对你之后的面试也会有一定帮助。

技术这种东西没有绝对的对错,倘若文中有误还请谅解,并欢迎与我讨论。自主思考永远比被动接受更有效。

Reference

/d/file/gt/2023-12/f1ayt3532gb.html 6 月编程语言排行榜:C 与 Java 进一步拉开差距、Rust 跃进 TOP 20

☞20 位行业专家共话选型经验,CSDN「选型智囊团高端研讨会」圆满落幕!

☞马云曾卖鲜花,柳传志卖冰箱!摆摊吧,程序员!

☞韩版马化腾:在大财阀围堵下仍白手起家的凤凰男,抢滩加密交易平台、公链赛道

☞一个神秘URL酿大祸,差点让我背锅!

☞Uber 前无人驾驶工程师告诉你,国内无人驾驶之路还要走多久?

微恐怖小说推荐,西子绪的【我五行缺你】

推荐一本灵Y风水文,西子绪的【我五行缺你】超级好看

第一本:我五行缺你——作者:西子绪

简介:

震惊!无辜公务员重生骗子身体,竟是被男人做出这种事……风水界里都说林逐水无所不知,无所不晓,现在看来,他唯一算错的了,就是他和周嘉鱼的姻缘。周嘉鱼性温,皮薄肉嫩,骨脆髓香。他万万没想到,自己重生后最担心的事,居然是不要惹某人不高兴以至于解决掉。周嘉鱼:在重生之前我一直觉得自己会是个坚定的社会主义接班人,直到我变成了骗子,还遇到个算命贼准的大佬。林逐水:和我在一起不开心吗?周嘉鱼:开心,我开心死了,大佬要是可以别每天思考关于我的菜单我就更开心了。林逐水:不可以。周嘉鱼:……

入坑指南:

阮云婕说完之后也从包里掏出了女士烟,缩着肩膀点了一根,她道:“林先生,这、这到底是什么东西,我还有救么……我才二十多岁,我不想死啊。”

林逐水没说话。

睿哥见林逐水似乎真的不打算接手这件事,也有点急了,他说:“林先生,我求您帮帮我吧,就看我爸的面子上……”

也不知道睿哥的父亲到底是何身份,林逐水听完后,轻叹一声,到底是同意了:“好。”

睿哥和阮云婕的眼神瞬间亮起,他道:“那、那您什么时候有时间?”

林逐水说:“这事情不能再拖,你定好今晚的机票,争取明日便到。”

睿哥连声说好,赶紧拿出手机开始办事。

周嘉鱼本来以为这事情到这儿就没他什么事儿了,结果林逐水却忽的扭头对着沈一穷和周嘉鱼说:“你们跟着我过去。”

沈一穷激动的直拍周嘉鱼的大腿。

周嘉鱼被他拍的腿麻了半边,还得咬着牙说:“可是林先生,我什么都不懂呀……”

林逐水淡淡道:“不懂就学。”

周嘉鱼:“……好。”

沈一穷是不理解周嘉鱼这种不喜欢掺和事儿的性格的,他巴不得天天跟在林逐水的身边,按照夸张一点的说法就是,如果林逐水真的看上了他,他估计会激动的抱着枕头住过去,因为这样他就能天天粘着林先生了。

祭八也在劝周嘉鱼主动点,说遇到这种事情并不常有,多学点东西总该是好的。

周嘉鱼被说服了,乖乖的上楼开始收拾行李。其实他也没什么要收拾的,就是几件衣服和洗漱用品,用沈一穷给他的背包装起来就成。

睿哥的机票很快就订好了,说是下午六点左右的飞机。

阮云婕来时的气势已经完全不见,此时乖的像只兔子似得缩在睿哥身边,看起来倒是有几分楚楚可怜的味道。

“林先生,能先和我说说,那到底是什么东西么?”客厅里安静了会儿,阮云婕没忍住,弱弱的开口。

林逐水冷漠道:“是什么东西,最清楚的不该是你自己?”

阮云婕哑然,她明显的从林逐水的语气里听出了淡淡的厌恶,但又没办法反驳。睿哥也猜到了些事情,脸色铁青,可碍于林逐水在场,他只能压下了心中的火气,一个劲的抽闷烟。

好不容易熬到了六点,园子里的司机送五人去了机场。

周嘉鱼坐在飞机上和祭八聊天,说:“祭八,你坐过飞机么?”

祭八说:“我不记得了。”

周嘉鱼道:“那你记得什么?”

祭八警惕道:“你是在套我的话吗?”

周嘉鱼:“……你太敏感了小祭八。”他说完这话就沉默了,然后再心中默默的佩服祭八的名字,觉得自己以后还是叫他小八算了。

祭八闲的没事儿,又开始梳理羽毛,周嘉鱼则拿起杂志开始翻看。

晚上九点左右,几人到达了目的地。

睿哥和阮云婕都是一脸倦色,特别是阮云婕,若不是下飞机之前扑了厚厚的粉底又补了腮红,恐怕谁都会觉得她刚从医院里出来。

接待的人是阮云婕的经纪人,一个三十多岁的漂亮女人。和阮云婕的美比起来,她显得更加内敛干练,一看就是那种做事特别靠谱的人。

“是直接回去么?”经纪人问,“云婕?”

“直接回去。”阮云婕道,“周姐,麻烦你了。”

周姐全名周珊灵,从阮云婕出道就当了她的经纪人,两人关系看起来还算不错,她蹙眉:“云婕,到底是怎么回事儿,你都休息了半个月了,你不告诉我我怎么帮你应付高层,这几位是……?”

阮云婕面色疲惫,道:“再给我一点时间,他们是我朋友,来帮忙的。”

周珊灵眼神扫过,几乎是瞬间就把目光停在了林逐水身上,经历丰富的她几乎是在第一时间,就确定了眼前的人身份不凡,她注意到了林逐水手上的那串玉珠,眼里流露出狐疑之色。

但无论是阮云婕,还是周嘉鱼他们,并没有要解释的意思。甚至说除了周嘉鱼之外,沈一穷和林逐水没什么表情的模样在周珊灵看来都算得上傲慢。

周嘉鱼反倒是成了三人之中神情最平和的那个,毕竟他目前还不是什么厉害的大师,骨子里只是个普普通通的公务员。

司机将车开到了阮云婕的住所,整个途中大家都格外安静。

阮云婕最后下车的时候,周珊灵说了句:“云婕,你真的什么都不打算和我说?”

阮云婕迟疑片刻,面露歉意:“抱歉,周姐。”

周珊灵说:“行吧,你自己注意。”她说完回头便走,看起来好像有些生气了。

阮云婕却无力去安抚她,她现在腹部伤口的疼痛还在折磨着她的神经,然而这并不是她最怕的,她最怕的身边这个冷的不像人类的风水先生。

阮云婕住的是别墅,看得出来安保很不错,只是还没进门,周嘉鱼就莫名其妙的觉得这房子有点渗人,连带着脚步也停顿了一下。

“怎么?”沈一穷走在周嘉鱼身边,注意到了他的表情。

周嘉鱼说:“这房子让人觉得好不舒服……”

沈一穷说:“有点。”他也感觉到了什么,但没有周嘉鱼的感觉那么明显。

阮云婕走到别墅门口,用指纹开了锁。

门一开,便有一股子穿堂风刮过,周嘉鱼在那风里嗅到了一股子腥味。这腥味不浓,很快便散在了空气里,让周嘉鱼来不及分辨这到底是什么。

阮云婕却像是没闻到似得,面不改色的走进屋子开了灯。

客厅里几扇明晃晃的大灯亮着,并不会让人觉得热闹,惨白的灯光映照在深色的沙发上,那种瘆得慌的感觉反而更浓了。

周嘉鱼搓了搓自己手臂上的鸡皮疙瘩:“怎么感觉那么冷……”

沈一穷没觉得冷,他在屋子里转了一圈,若有所思:“这房子风水应该是不错的啊。”

无论是家具摆放,还是装饰格局,肯定是找这方面的人看过的。

“不错?”周嘉鱼不是很懂这些,只能由着感觉来说,他低低道:“可是装修风格真让人不舒服。”

整间屋子都是深色调的,从沙发到地板,几乎全部偏深色,周嘉鱼刚进来时乍一看差点以为那是血液凝固后的深黑色,直到阮云婕开了灯,这种错觉才消散。

“林先生,您先坐。”睿哥道,“您坐,我给您泡杯茶。”

林逐水摇摇头拒绝了睿哥的好意,转身直接朝着二楼去了。

阮云婕紧张的跟在他后面。

林逐水上楼之后,便去了主卧,阮云婕也不敢拦,但看她的表情,显然是有些忧虑。

二楼的装修风格和一楼有些类似,整体气氛很是压抑,就算开了灯也显得很昏暗,也不知道阮云婕为什么会把房子装修成个这种模样。

沈一穷比周嘉鱼知识丰富许多,注意到阮云婕住所里摆放了不少风水学上有讲究的物件,光是客厅里的鱼缸就用九宫之法就算了位置。

林逐水显然对这些小打小闹兴趣不大,直接去了阮云婕的卧房。

阮云婕卧房里放着一张大床,床单是深红色,窗帘也是深红色,灯光一亮,红的刺目,周嘉鱼站在门口表情有点僵,沈一穷问他怎么了。

周嘉鱼说:“你没看见?”

沈一穷说:“看见什么?”

周嘉鱼说:“满屋子的黑气……”

沈一穷仔细看了看,还是什么都没看到,这就是风水这一行最气人的地方了,后天努力十年,比不上天赋异禀的入门汉。他的资质在风水这行里已经称得上上乘,但奈何遇到了周嘉鱼这样的不世奇才。

林逐水没管在后面嘀嘀咕咕的两个人,已经进了屋子,他在屋中转了一圈,便指了指床头,让阮云婕打开。

阮云婕虽然有些犹豫,但也不敢反驳,缓缓走到床边,伸手按住床头用力一掰。

咔嚓一声,床头落下,沈一穷和周嘉鱼看到了床头里放着的东西,均是露出愕然之色。

其中睿哥反应最大,直接骂了脏话,他道:“阮云婕,你他妈的是不是疯了?这种东西你放在床头里面?”

阮云婕没吭声,抱着双臂瑟瑟发抖。

睿哥道:“我真是没想到,阮云婕,你这种事儿,一般人能做出来么?”

只见床头之中,放着一个小小的玻璃罐,罐子里泡着一具婴孩的尸体。看大小至少三个月了,已经可以看出人形,还有缠着的脐带。

罐子旁边还放一个香案,香案上有几柱已经烧完的香。

周嘉鱼还注意到,床头的角落里,有一个金属质地的小娃娃,那娃娃不过拇指大小,在光线不充足光线之下并不显眼。而周嘉鱼第一眼便注意到的原因,却是那个娃娃所在之处的黑气有些特别,隐隐约约好像形成了个小孩儿的形状。

“这孩子是谁的?是你之前告诉我要打掉的那个?”睿哥气浑身发抖,他指着阮云婕鼻子骂:“你是想红想疯了?这种事情都做得出来?”把自己的孩子装在罐子里供奉起来,就算他一个门外汉也能猜到点什么。

阮云婕哭道:“我只是不想再那样下去了,王鑫睿,你难道不想我红?”

睿哥咬牙:“那你也不能这么做啊!之前那些例子摆在你面前,你看不到么?”