第一章:MySQL架构和历史
1.MySQL逻辑架构
MySQL存储引擎架构:将查询处理以及其他任务系统和数据的存储处理分离开来,这样做的好处在于可以根据需要灵活选择存储引擎。
- 第一层架构 —— 连接处理、授权认证、安全等。
- 第二层架构 —— MySQL的核心服务功能:存储过程、触发器、视图、查询缓存、查询解析、查询优化、函数等等。
- 第三层架构 —— 实现了不同的存储引擎,存储引擎负责MySQL中数据的存取.
2.并发控制
2.1 读写锁
读锁是共享的,互相不阻塞的,多个客户端在同一时刻可以同时读取同一个资源而不互相影响.
写锁是排他的,写锁会阻塞其他的写锁和读锁,这样可以保证在给定的时间里面只有一个客户端在写入.
2.2 锁粒度
系统不应该花费巨大的性能来管理锁,因此需要在安全性和锁开销之间寻找平衡点,两种锁策略:
- 表锁:锁定整张表.一个用户在对一张表写操作(增删改)时,获取到写锁,阻塞其他用户的所有读写操作.(开销小)
- 行级锁:简单理解为锁住写操作涉及的记录行.(最大程度的支持并发,开销高)
3.事务
3.1 ACID
- 原子性:一个事务是一个不可分割的最小单位,整个事务的所有操作要么全部成功要么全部失败回滚.
- 一致性:数据库总是从一个一致的状态转移到另一个一致的状态,事务没有提交数据不会持久化到磁盘中.
- 隔离性:通常来说,一个事务在未提交之前对其他事务来说是不可见的.
- 持久性:一旦事务成功提交,操作完的数据就会北保存到数据库中.
3.2 事务的隔离级别
- read uncommitted:(未提交读)即便事务没有提交,对其他事务也是可见的,即事务可以读取到未提交的数据,脏读.
- read commit:(提交读)一个事务在提交之前,对其他事务而言是不可见的,即不可重复读.
- repeatable read:(可重复读)一个事务可以多次读取同一条记录,解决了脏读,会出现幻读.MySQL的默认隔离级别.
- serializable:(串行化)强制让事务串行化,隔离级别的最高级.
3.3 死锁
两个及以上的事务在同一资源上互相占用,并请求锁定对方占用的资源.死锁检测和死锁超市机制的出现在一定程度上避免了死锁的问题.
3.4 事务日志
使用事务日志,存储引擎只需要在修改表数据的时候修改内存拷贝,再把该修改行为记录到持久到硬盘上的事务日志中,而不用每次都把修改的数据本身持久化到硬盘上.
3.5 MySQL的事务
MySQL事务两种事务引擎:InnoDB和DBN Cluster.其中MySQL采用了自动提交事务的模式,
4.多版本并发控制
MySQL的大多数事务性存储引擎都不是简单的行级锁,他们几乎都实现了多版本并发控制(MVCC),MVCC是通过保存数据在某个时间点的快照来实现的.典型的有乐观并发控制和悲观并发控制。InnoDB的MVCC是通过在每个记录的后面保存两个隐藏列来实现的:一个保存行创建时间,一个保存行过期时间(删除时间),其中保存的不是实际时间,二十系统版本好,,每开始一个新的事务,版本号自动增加。事务开始时的系统版本号就作为事务版本号用来和查询到的每行记录进行比较。
以下是repeatable read隔离级别下,MVCC的操作:
SELECT
InnoDB会根据下面两个条件检查每行记录;
1. 只查找版本早于当前事务版本的数据行(小于等于事务的系统版本号)。确保事务读取的行,在事务开始之前就存在的,或者是事务自身插入或者修改过的。
2. 行的删除版本号要么未定义,要么大于当前事务版本号。确保事务查询到的行,在事务开始之前没被删除。
只要符合上述两个条件的记录,才能返回作为查询结果insert操作:InnoDB为新插入的每一行保存当前系统版本号为行创建版本号。
delete操作:InnoDB为删除的行保存当前系统版本号作为行删除版本号。
update操作:InnoDB为插入一行新数据保存当前版本号作为该新行行创建版本号,同时保存当前系统版本号到原来的行作为行删除版本号。
MVCC只在repeatable read和read committed两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容,因为read committed总是读取最新的数据行,而不是符合当前事务版本的数据行。而serializable则会对所有读取的行都加锁。
5.MySQL的存储引擎
5.1 InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是repeatable read(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。
5.2 MyISAM 存储引擎
MyISAM包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,缺陷:崩溃后无法安全恢复。如果表在创建并导入数据以后,不会再进行修改操作,那么这样的表比较适合采用MyISAM压缩表
第一章:MySQL架构和历史的更多相关文章
- 高性能MySQL(第4版) 第一章 MySQL架构 读书笔记
这本书去年11月出的,今年中文版也出了,并且直接上了微信读书,之后有空就读一读,分享下读书笔记~ 原文内容比较充实,建议有时间可以读一下原文. 第一章主要是个概览. MySQL的逻辑架构 默认情况下, ...
- 高性能mysql 第1章 mysql架构与历史
mysql逻辑架构图: 第一层 客户端 第二层(服务层):针对所有类型的存储引擎可以公共提取的部分.将存储引擎抽离之后的其他部分都在这里.如:查询解析,分析优化,内置函数,存储过程,触发器,视图. 第 ...
- 高性能mysql笔记 第一章 mysql架构
1.1 mysql逻辑结构 第一层: 负责连接处理,授权认证,安全等事情 第二层:负责mysql的大部分核心功能 ,查询解析,分析,优化,缓存和所有的内置函数,所有跨存储引擎的功能都在这一层实现,, ...
- mysql笔记01 MySQL架构与历史、Schema与数据类型优化
MySQL架构与历史 1. MySQL架构推荐参考:http://www.cnblogs.com/baochuan/archive/2012/03/15/2397536.html 2. MySQL会解 ...
- MySQL性能调优与架构设计——第2章 MySQL架构组成
第2章 MySQL架构组成 前言 麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成, ...
- 第一章 MYSQL的架构和历史
在读第一章的过程中,整理出来了一些重要的概念. 锁粒度 表锁(服务器实现,忽略存储引擎). 行锁(存储引擎实现,服务器没有实现). 事务的ACID概念 原子性(要么全部成功,要么全部回滚). 一致性 ...
- 第 2 章 MySQL 架构组成
麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...
- 第一章 mysql 的架构与历史
一.mysql 的逻辑架构 1.连接管理与安全性 2.优化与执行 二.并发控制 1.读写锁 2.锁粒度 三.事物 1.隔离级别 2.死锁 3.事物日志 四.多版本并发控制 五.Mysql 的存储引擎
- 高性能MySQL——第一章MySQL的架构与历史
1.可以使用SHOW TABLE STATUS查询表的相关信息. 2.默认存储引擎是InnoDB,如果没有什么很特殊的要求,InnoDB引擎是我们最好的选择. 3.mysql的infobright引擎 ...
随机推荐
- 小程序列表循环出来的list是不同接口赋的值
需求:首页有三个列表,样式形式都是一样的,可以循环展示,但是循环的内容list部分是来自于不同的三个接口. data: { indexList:[{ name: "中考体能突击营" ...
- {$DEFINE WANYI}
var Form5: TForm5; {$DEFINE WANYI}implementation{$R *.dfm}procedure TForm5.Button1Click(Sender: TObj ...
- 洛谷P1351 联合权值
\(\Large\textbf{Description:}\) \(\large一棵树,父子之间距离为1,求距离为2的两点点权之积的最大值与和.\) \(\Large\textbf{Solution: ...
- haproxy+keepalive双主高可用实现负载均衡
转载自https://blog.51cto.com/3381847248/1977073 前面我已经介绍了haproxy结合keepalive做简单的双主高可用,如果不清楚的话,可以去我的上一 篇博客 ...
- git下载安装、配置及idea初始化
安装 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.0.tar.gz git 安装依赖 yum -y insta ...
- Qt编写的项目作品2-控件属性设计器(组态)
一.功能特点 自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个. 拖曳到画布自动生成对应的控件,所见即所得. 右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:多对多关系范例
import java.util.List ; import java.util.ArrayList ; public class Course{ private String name ; priv ...
- 132-PHP子类和父类同名函数的调用
<?php class father{ //定义father类 public function cook(){ return '烹饪'; } } class son extends father ...
- 调试ASP.NET程序
用VS打开你的项目 从VS中找到"调试"-----"附件到进程",然后选中w3wp.exe,点击附件到进程,然后再发送数据进行调试就可以了
- JNI调用so动态库
1.编写native接口 package org.demo; public class JniDemo { public static native int bmp2fea(byte[] bmp, b ...