MySQL架构学习笔记

MySQL逻辑架构
了解MySQL的架构有助于深入理解MySQL服务器,下图是MySQL的三层逻辑架构图(图片来自于网络)。

第一层用于对客户端的连接处理、安全认证、授权等。每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。

第二层包含了MySQL的核心服务功能,包括查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等。当客户端发起请求时,如果是SELECT操作,MySQL会先检查是否命中查询缓存,命中则直接返回查询缓存中的数据;否则,MySQL会解析查询并创建对应的内部数据结构(解析树),执行各种优化,然后执行。

第三层包含了存储引擎,存储引擎负责数据的存储和提取。MySQL中有很多种不同类型的存储引擎,每个存储引擎各不相同,MySQL服务器通过API与存储引擎通信,屏蔽了各种存储引擎之间的差异。

MySQL中的锁
MySQL在处理并发读和写的时候,分别使用共享锁(读锁)和排它锁(写锁)。

对共享资源高并发操作,在加锁的时候,最好能只锁定所需要的数据,控制锁的粒度、提高并发能力。MySQL提供了两种最重要的锁策略,表级锁和行级锁。

表级锁,即锁定整张表。在对表进行插入、更新、删除操作时,需要先获得写锁,锁定整张表,其它读写操作将会被阻塞。读锁之间是不会阻塞的。需要注意的是alter table操作会使用表级锁,所以对数据量很大的表进行alter table操作时,需要谨慎。

行级锁,即只锁定数据所在的行,行级锁只在存储引擎层实现。行级锁可以很好的支持并发处理,但是也会导致大量的资源开销。

事务特性
四大特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

原子性:一个事务中的所有操作,要么全部成功执行,要么全部失败回滚;
一致性:事务执行结果使数据库从一个一致性状态变到另一个一致性状态;
隔离性:事务操作提交之前,操作结果对其它事务不可见;
持久性:事务提交后,所有的修改操作会永久保存到数据库中。

事务隔离级别
SQL标准中定义了四种隔离级别,分别是Read Uncommitted、Read Committed、Repeatable Read、Serializable。

Read Uncommitted:该隔离级别下,事务中未提交的数据对其它事务是可见的,即其它事务可以读取到未提交事务的数据,出现脏读。

Read Committed:该隔离级别下,事务只能读取到已提交事务所改变的数据,解决了脏读的问题,但是会出现不可重复读,即在一个事务前后两次读取某数据的中间时刻,有其它事务修改了该数据,导致两次读取的数据不一致。

Repeatable Read:该隔离级别是MySQL数据库的默认事务隔离级别,它解决了不可重复读的问题,但是会出现幻读,即事务在读取某范围内的数据时,其它事务在该范围内插入了新纪录,导致之前的事务再次读取会不一致。

Serializable:最高的隔离级别,该隔离级别下,通过强制事务串行执行、在读取的每一行数据上加锁,来避免出现幻读的问题。因为读取的数据每行上都会加锁,可能会导致大量的超时和锁竞争问题,所以一般不使用该级别,除非是数据一致性要求特别高的情况。

下面通过一张图清晰的展示各隔离级别。

MySQL可以通过执行SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别,新设置的隔离级别将在下一个事务开始的时候生效。

MySQL中的死锁
死锁是指多个事务在同一资源上相互占用,并请求锁定对方所占用的资源,从而导致的恶性循环现象。

数据库系统为了解决这个问题,实现了死锁检测和死锁超时机制。在MySQL的InnoDB存储引擎中,解决死锁的方法是将持有最少行级排它锁的事务进行回滚。

MySQL事务日志
事务日志,即一种特殊的操作记录日志。

存储引擎在修改表数据的时候,只修改内存中的拷贝,然后将修改行为记录保存到硬盘上的事务日志中,对事务日志的保存操作采用追加的方式,保存操作是顺序IO,相对于存储引擎直接将数据持久化到硬盘的随机IO高效的多。事务日志保存后,内存中被修改的数据在后台可以慢慢的持久化到硬盘。如果事务日志保存成功了,而内存中被修改的数据没有成功的写入硬盘,发生了系统崩溃,存储引擎会在重启时自动恢复这部分数据。

MySQL中的事务
MySQL中的事务是在存储引擎中实现的,所以上层的服务是不会管理事务的。默认情况下,MySQL自身提供了两种事务型的存储引擎,分别是InnnoDB和NDB Cluster。

在默认情况下,MySQL事务采用自动提交模式,即如果没有显示的开启一个事务,那么每一次的查询都将被当做一个事务执行自动提交。当然,也可以通过设置来改变这种自动提交的模式。如果想开启自动提交,可以通过命令SET AUTOCOMMIT = 1或SET AUTOCOMMIT = ON来设置;关闭自动提交模式,可以通过命令SET AUTOCOMMIT = 0或SET AUTOCOMMIT = OFF来设置。

InnoDB存储引擎采用的是两阶段锁定协议,在事务执行的过程中,InnoDB会根据隔离级别在需要加锁的时候自定加锁,锁只有在事务提交或回滚的时候才会释放。当然,也可以显示的加锁,如使用SELECT FOR UPDATE,也可以使用服务层实现的LOCK TABLES和UNLOCK TABLES。

多版本并发控制(MVCC)
基于对并发性能的考虑,MySQL的大多数事务型存储引擎都实现了多版本并发控制,可以简单的认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,降低了开销。

InnoDB的MVCC是通过在每行记录后添加两个隐藏列来实现的,一个列用于保存行的创建时间,一个列用于保存行的过期时间,这两个时间在实际存储的时候,存储的是系统版本号。每开始一个新事务,系统版本号都将递增。需要注意的是MVCC只能在Read Committed和Repeatable Read隔离级别下正常工作。

MySQL存储引擎
MySQL自身和第三方提供了多种存储引擎,每种存储引擎优势各不相同,可以根据实际业务需要来选择对应的存储引擎。

InnoDB是MySQL的默认事务型存储引擎,主要用来处理大量的短期型事务。它采用MVCC来支持高并发,默认的事务隔离级别是Repeatable Read,并通过间隙锁策略防止幻读的出现。InnoDB表是基于聚簇索引建立的,而聚簇索引可以提高对主键查询的性能,但是它的二级索引(非主键索引)中必须包含主键,如果主键列很大,并且有很多个二级索引,那么这些索引将会占用很大的空间和资源,所以在创建主键的时候尽量的小。

在MySQL5.1及之前的版本中,MyISAM是默认的存储引擎,它提供了全文索引、压缩、空间函数等功能,但是它不支持事务和行级锁,并且崩溃后无法安全恢复,而InnoDB引擎是可以自动崩溃恢复的。MyISAM在并发的情况下,对整张表加锁,读操作会对需要读的所有表加共享锁,写入时对表加排它锁。

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

推荐阅读更多精彩内容