MySQL逻辑架构
连接/线程处理->查询缓存/解析器->优化器->存储引擎。
第二层是核心服务:查询解析、分析、优化、缓存以及所有内置函数,所有跨存储引擎功能。
读写锁
读锁(共享锁)和写锁(排它锁)
锁策略:
表锁(table lock):开销小;
行锁(row lock):更大并发处理,只在存储引擎中实现(例如innoDB)。
事务
A 原子性(atomicity):不可分割的最小单元,要么全成功,要么全失败回滚;
C 一致性(consistency):总是一个一致性状态到另一个一致性状态;
I 隔离性(isolation):提前前对其它失误是不可见的;
D 持久性(durability):一旦事务提交,修改永久保存(模糊的概念)
隔离级别
READ UNCOMMITTED(未提交读):事务可以读取未提交的数据,即脏读,不常用;
READ COMMITTED(提交读):大多数数据库的默认级别,提交后才可以被其它事务看到,这个级别也叫不可重复读(nonrepeattable read);
REPEATTABLE READ(可重复读)保证同一事务中多次读取结果一致,MYSQL的默认事务隔离级别,InnoDB通过MVCC机制解决了幻读问题。【幻读:某个事务读取时,另一个事务在该范围内的写入,如果当前事务再次读取就会产生幻行】
SERIALIZABLE(可串行化):最高隔离级别,事务串行,即使是行级锁,也可能导致大量锁竞争问题。
死锁
死锁是指两个以上事务在同一资源上的相互占用,从而导致恶性循环现象。
检测方法:死锁检测;超时处理。
解决方法:最少行排他锁的事务回滚(比较简单的死锁回滚方法)
MySQL事务
自动提交(AUTOCOMMIT):默认开启,某些表操作会强制执行提交事务;
事务中使用混合引擎是危险的,因为Mysql无法为不支持事务的存储引擎执行回滚,也不会提醒也不会报错;
通常mysql隐式锁定,但是也支持显示锁定,如:select … lock in share mode、select … for update。
多版本并发控制MVCC
行级锁的变种,开销更低。(INNODB的MVCC,每行记录+隐藏列:创建时间、过期时间)
SELECT:条件一:早于当前事务版本;行的删除版本要么未定义要么大于当前版本号;
INSERT:插入的每一行保存当前系统版本号作为行版本号;
DELETE:同理插入;
UPDATE:插入新行,版本号为当前;保存当前版本号到原来行作删除标识。
总之:性能更好,只是增加空间成本和检查维护工作。
MYISAM
不支持事务和行级锁,崩溃后无法安全恢复。
加锁和并发:整张表加锁;
修复
索引:可以前500词创建索引;全文索引是基于分词创建的索引
延迟更新索引键
myisam压缩表:不更新的表压缩,减少IO开销的收益大于CPU
Memroy引擎
支持hash,速度非常快。适用场景
1. 用于查找或映射表;
2. 缓存周期性聚合数据表;
3. 保存中间数据表。
MYSQL临时表默认是memroy表,但是如果超出限制,或者含有blob或text字段则自动转换成myisam表,效率自然更低。
引擎选择标准
事务支持、备份、崩溃恢复、特有特性