第一部分:存储引擎
主要内容:
-
目标:面向在线事务处理的应用,面向多维数据分析处理的应用
存储限制:64T,无
MVCC,非锁定读:支持,不支持
Geo处理:不支持,支持
自适应哈希:支持,不支持
聚簇索引:支持,不支持
数据缓存:支持,不支持
存储消耗,内存消耗:高,地
批量插入速度:慢,较快
外键:支持,不支持
InnoDB
插入缓冲
二次写
自适应hash
AIO(IO合并等优化)
刷新临接脏页
索引
锁
锁类型
I锁
IX锁
S锁
X锁
锁关系:
IS IX S X
IS 1 1 1
IX 1 1
S 1 1
X
锁引申
一致性非锁定读
- MVCC实现,通过读取行记录的历史版本,实现读取的时候不加锁
一致性锁定读
- 显示加S/X锁
自增长
表锁自增
互斥量自增
外键
- 回源表查询的时候,显示使用S锁
锁算法
Record Lock
- 单行记录锁
Gap Lock
- 范围锁
Next-Key Lock
单行+范围锁
对于唯一属性的锁,会降级成为Record Lock
锁存在的问题:锁用来实现事务隔离,使得事务可以并发,但仍然存在一些问题
脏读:在一个事务中读到了别的事务未提交的数据
- MVCC 可以解决
不可重复读(幻读):在一个事务中,读到了别的事务提交的数据
- Next-Key Lock可以通过范围的锁定解决幻读
丢失更新:两个事务的select 跟 update 交替执行
- 在select的时候加X锁可以解决
死锁
检测
waits-for graph:
图节点:事务定义
节点的边:节点A指向节点B,A依赖B的锁释放
存在回路则死锁
|
|
事务的实现
手段:write-ahead log+LSN:在事务提交之前先写undo log redo log
redo log:记录每一个页面的改动
undo log:insert/update log 记录插入的数据,或者更新的字段跟字段值
redo log 跟 binlog
redo log在事务提交的过程中写的,binlog在事务完成之后写
redo log 针对的是数据页的改动记录,binlog是用于实现主从同步
redo log是引擎层面的实现,binlog是mysql服务层面的实现
redo log是幂等的,binlog不能保证幂等
联想:
对于大部分的异常,mysql不会回滚,死锁异常则会回滚
问题
mysql的线程模型?