《高性能MySQL》---第1章 MySQL架构与历史
1、MySQL逻辑架构
1.1、连接管理与安全性
1.2、优化与执行
select 语句 在MySQL Server中的执行流程:
MySQL Server 会先检查缓存,如果找到,直接返回;
没找到--->MySQL Server解析器 解析select语句--->优化器 请求 存储引擎 提供容量或某个具体操作的开销信息、表数据的统计信息等,根据统计信息进行优化;
(优化器 不关心 表使用哪个存储引擎,但存储引擎 影响 优化器的优化)
2、并发控制
2.1、并发读(读锁)、并发写(写锁)
2.2、锁粒度
并发资源 的粒度越小越好;
2.3、MySQL提供的锁策略:
表锁:
MySQL中最基本的锁,并发写时,会锁住整张表,开销最小;
行级锁:
某些存储引擎实现了行级锁,可以最大程度支持并发,但也带来了最大的开销;
3、事务
3.1、隔离级别
每种存储引擎 实现的隔离级别不尽相同;
Read Uncommitted(读未提交):
写事务 修改的数据 未提交时,对其他事务可见;
读取到 写事务未提交的数据,造成脏读;
Read Committed(读提交):
只能 读取 已提交事务的数据,未提交的写事务数据 对其他事务不可见;
执行2次查询,会出现不一样 的结果,造成幻读;
Repeatable Read(可重复读):
MySQL默认的隔离级别;
同一个事务中多次读取同样记录的结果是一致的;
Serializable(可串行化):
解决了幻读;
在 读的每一行数据上 加锁;
4、MySQL事务
4.1、MySQL Server层 不管理事务,事务 由下层的存储引擎实现 ;
4.2、MySQL 提供 2种事务型的存储引擎:InnoDB、NDB Cluster;
4.3、MySQL 默认 自动提交事务;
当前连接中,可以通过 设置 AUTOCOMMIT 变量 启用|禁用 事务自动提交:
set autocommit=1|on; 表示启用事务自动提交
set autocommit=0|off; 表示禁用事务自动提交
4.4、有一些命令操作,在执行之前 会强制 commit 当前的事务活动: alter table...
4.5、MySQL 通过 set transaction isolation level 设置整个数据库的事务隔离级别,也可以 只改变当前会话的事务隔离级别:
set transaction isolation level read committed;
4.6、同一个事务中 使用不同的存储引擎 是不可靠的,一旦 事务rollback,数据会不一致;
4.7、隐式锁定、显式锁定
InnoDB 采用 两阶段锁定协议;
隐式锁定:
事务执行过程中,随时都可以执行锁定,锁只有 在执行 commit|rollback 才会释放(且 所有的锁 在同一时刻被释放);
InnoDB 会根据 事务隔离级别 在需要的时候自动加锁;
显式锁定:
InnoDB 支持 通过特定语句进行显式锁定:
eg: select ... lock in share mode; select ... for update;
4.8、MySQL 也支持 lock tables ; unlock tables; 在MySQL Server层实现,与存储引擎无关;
5、多版本并发控制(MVCC)
5.1、MySQL大多数 事务型存储引擎 实现的 不单是简单的行级锁,基于性能考虑,一般都 同时实现了 多版本并发控制;
5.2、MVCC 很多情况下 避免了加锁操作,开销更低(非阻塞的读操作、写操作只锁定必要的行);
5.3、MVCC的实现 通过 保存 数据在某个时间点的快照 实现(不管执行多长时间,每个事务看到的数据都是一致的);
5.4、MVCC只在 Repeatable Read、Read Committed 2个事务隔离级别下 有效;
(read uncommitted 总是读取最新的数据行; serializable 对 读取的每一行加锁;)
6、MySQL存储引擎
6.1、InnoDB存储引擎
a,InnoDB 的数据 存储在表空间中;
表空间:InnoDB管理的一个黑盒子,由一系列的数据文件组成;
b,InnoDB 采用 MVCC(多版本并发控制)支持高并发;
c,InnoDB 实现了4个标准的事务隔离级别,默认的是 repeatable read;
d,InnoDB 表 基于 聚簇索引 建立;
聚簇索引 :
对主键查询有很高的性能;
e,InnoDB 的存储格式 平台独立,可以 复制到其他平台;
7、MySQL发展史