注意 : the most important character that MySQL have is storage engine architecture, which seperate the Query Processing and other Server Task and Data’s storage/extract.
一.Mysql逻辑架构
1.并发控制
1.1 读写锁
共享锁(shared lock,读锁),排它锁(exclusive lock, 写锁)
读锁是共享的,互相不阻塞。
写锁是排他的,一个写锁会阻塞其他的写锁和读锁。
1.2 锁粒度
try to lock the data what you want to update only, not all data, this way can increase the concurrency of shared resources.
but locking also consumes resources.so we need to find a balance between lock consumes and data’s security.
(1)表锁(table lock)
table lock is the strategy with least overhead.
(2)行级锁(row lock)
row lock is the strategy with most concurrency and most overhead.
2.事务
2.1 隔离级别
(1)READ UNCOMMITTED(未提交读)
事务中的修改,即使没有提交,对其他事务也是可见的。这被称为脏读。很少使用。
(2)READ COMMITTED(提交读)
一个事务提交之前,所做修改对其他事务不可见。
(3)REPEATABLE READ(可重复读)——MySQL的默认级别
解决了脏读的问题,保证了在同一个事务中多次读取同样记录的结果是一致的。但是无法解决幻读。指的是当某个事务在读取某个范围内的记录时,另一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。
(4)SERIALIZABLE(串行化)
隔离级别最高。
2.2 死锁
两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环。
多个事务试图以不同顺序锁定资源时,就可能产生死锁。
InnoDB处理死锁的方法:将持有最少行级排它锁的事务进行回滚。
2.3 事务日志
use transaction log, storage engine can update the memory copy of table only, and record to transaction log on disk,not persistent to disk every time.
transaction log can increase the efficiency of transaction.
3.多版本并发控制
MVCC的实现,是通过保存数据在某个时间点的快照来实现的。
InnoDB的MVCC,在每行记录后面保存两个隐藏的列。一个是行的创建事件,一个是行的过期时间(删除时间)。这里的时间指的是系统版本号。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
保存这两个额外的版本号,使得大多数操作都可以不用加锁。
4.Mysql存储引擎
4.1 InnoDB
默认,设计用来处理大量的短期事务。
数据存储在表空间中,由一系列的数据文件组成。
通过间隙锁策略防止幻读的出现。
基于聚蔟索引。
4.2 MyISAM存储引擎
不支持事务和行级锁。
将表存储在两个文件中:数据文件和索引文件。