第一章: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引擎 ...
随机推荐
- java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver java.sql.SQLException
今天下午一直想用netbeans连接数据库,结果就是来来回回碰到这两个问题. 我还在想,连接数据库并不是一个什么困难的事情啊,我都按照教程上一步一步做的,代码什么的都感觉很好,怎么就找不到类呢,怎么就 ...
- 4.RabbitMQ 4种交换模式
请看 demo https://github.com/kevin-li-06/eshop.git
- UVA 12510/CSU 1119 Collecting Coins DFS
前年的省赛题,难点在于这个石头的推移不太好处理 后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可.先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找 ...
- 搭建selenium+Python+eclipse 的开发环境
下载安装Python,下载“python-2.7.9.msi”后可直接安装 下载安装setuptools,下载setuptools-11.3.1后,用命令提示符转到安装包中setup.py所在的位置, ...
- idea安装Maven Helper
1. File -> Settings... 2. 选择 Plunins, 查询 Maven Helper,如果没有,点击 Search in repositories 3. 选择 Maven ...
- RadioGroup的使用
前言: 使用RadioGroup就可以在选择情况多的时候,简化代码 RadioGroup 使用互斥选择时,会使用RadioGroup标签下面RadioButton,如下面的代码:(这样写下来,男和女的 ...
- 小程序中的web-view与h5网页之间的交互
官方文档:https://developers.weixin.qq.com/miniprogram/dev/component/web-view.html web-view 基础库 1.6.4 开始支 ...
- Ubuntu上安装tftp服务
1. 安装 sudo apt install tftpd-hpa 2.设置工作目录 mkdir ~/tftpdroot tftpdroot 3.修改配置文件 sudo vi /etc/default/ ...
- 【Leetcode】交替打印FooBar
[问题]我们提供一个类: class FooBar { public void foo() { ; i < n; i++) { print("foo"); } } publi ...
- cf 782# A.Andryusha and Socks B.The Meeting Place Cannot Be Changed C.Andryusha and Colored Balloons
看来快掉到灰名的蒟蒻涨rating也快... A题模拟一下就好(一开始还sb,, #include<bits/stdc++.h> #define LL long long using na ...