《高性能MySQL》读书笔记:第一章[MySQL架构与历史]
MySQL逻辑架构
MySQL最优秀的一点就是它的存储架构,将查询处理,系统任务,数据存储/提取相分离
并发控制
通过读写锁实现并发控制
读锁/共享锁:相互不阻塞,多个用户在同一时刻可以读取同一个资源
写锁/排他锁:一个写锁会阻塞其他读锁和写锁
锁粒度
锁粒度越小,并发程度越高,行锁粒度最小
MySQL在存储引擎层实现自己的锁策略和锁粒度,不同存储引擎自然不同锁策略和粒度
锁策略
表锁
机制描述:它会锁定整张表。一个用户在对表进行写操作(插入,删除,更新等)前,需要先获得写锁,这会阻塞其他用户对该表的所有读写操作。只有没有写锁时,其他读取的用户才能获得该锁,读锁之间是不互相阻塞的
写锁比读锁拥有更高的优先级,因此一个写锁请求可能会被插入到读锁队列前面,反之读锁不行
ALTER TABLE之类的语句会被MYSQL忽略存储引擎的锁机制
行锁
可以最大程度的支持并发处理。
只在存储引擎层实现
事务
ACID
原子性 atomicity
一致性 consistency :数据库总从一个一致性状态转移到另一个一致性状态。用户数据修改之后,系统发生崩溃也不会导致脏数据,因为事物没有提交
隔离性 isolation
持久性 durability
隔离级别
SQL标准中定义了4种隔离级别
较低的隔离级别通常可以执行更高的并发
READ UNCOMMITTED 未提交读
很少见
READ COMMITTED 提交读
大多数数据库系统的默认隔离级别(MySQL不是)
又叫不可重复读,两次执行同样的查询可能会读到不一样的结果
PEPEATABLE READ 可重复读
默认隔离级别
通过MVCC实现不可重复读
SERIALIZABLE 可串行化
最高隔离级别,强制事务串行执行
死锁
MySQL中死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象
InnoDB处理死锁的方法是:将持有最少行级排他锁的事务进行回滚
事务日志
数据的修改行为会先记录到事务日志中,事务日志是磁盘上一小块顺序IO,效率很高。
实物日志持久后,修改的数据可以在后台慢慢的写到磁盘上。
所以一次修改数据要写两次磁盘
MySQL中的事务
1.MySQL提供InnoDB和NDB Cluster两种支持事务的引擎
2.MySQL采用自动提交模式,每个查询自动的被当作一个事务执行提交操作
3.一些命令会强制提交活动事务:一般是修改大量数据的命令,如ALTER TABLE
4.InnoDB可以隐式或者显式的加锁
多版本并发控制
基于并发性能的考虑,事务的控制一般不采用加锁,而使用多版本并发。可以认为MVCC是行级锁的一个变种。
在每行记录后面保存两隐藏的列:创建的版本号 过期的版本号
规则
存储引擎
1..frm:存储表的定义
InnoDB
1.InnoDB通过间隙锁策略防止幻读的出现
2.InnoDB表是通过聚簇索引建立的
3.等等等等优点后面章节介绍
MyISAM
5.1及之前的版本,MyISAM是默认的存储引擎
不支持事务和行级锁
数据文件.MYD
索引文件.MYI
书中还介绍了好多其他引擎第三方引擎包括转换表的引擎相关,就不在此记录了先