1. MySQL 基本架构
三大范式:
1NF: 属性不可分
2NF:属性完全依赖于主键
3NF:属性不依赖于其它非主属性
- 连接器:身份验证和权限相关
- 查询缓存:MySQL 8.0 的时候已近弃用,因为这个功能不太实用
- 分析器:如果缓存中没有的话,SQL 语句会经过分析器来分析改语句是用来干嘛的,检查语法是否正确
- 优化器:按照 MySQL 认为的最优的方案去执行
- 执行器:执行语句,从存储 引擎返回数据
- 存储引擎:主要负责数据的存储和读取,可替换
2. 事务
2.1 事务的特性 ACID
- 原子性:保证多做要么全部完成,要么完全不起作用
- 一致性:执行事务前后,数据保持一致
- 隔离性:一个事务不被其它事务所干扰
- 持久性:一个事务被提交后,它对数据库中的数据的改变是持久的
2.2 并发事务可能造成的问题
- 脏读:一个事务正在修改数据,还没有提交,这个时候另一个事务也访问了这个数据,但是这个数据还没提交,所以是脏数据
- 幻读:一个事务读取了几行数据,接着另一个事务插入了一些数据,在之后的查询过程中,第一个事务可能会发现一些 “不存在” 的数据,就是幻读
- 不可重复读:在一个事务里多次读同一个数据,这个时候如果另外一个事务修改了这个数据,两次的数据就不一样,可能会发生不可重复度
- 丢失修改:两个事务都读同一个数据,这个时候在两个事务都未提交之前,都修改了数据,先提交的事务可能就会丢失修改
2.3 事务的隔离级别
READ-UNCOMMITTED
:允许读取未提交的数据变更,可能会有脏读、幻读、不可重复度READ-COMMITED
:允许读取并发事务已近提交的数据,可以阻止脏读,可能会有幻读、不可重复读REPEATABLE-READ
:默认值,对同一字段的多次读取结果都是一致的,除非是被自己的事务修改了,可以阻止脏读、不可重复读,可能会有幻读SERIALIZABLE
:所有事务依次执行- 在 InnoDB 情况下,可以使用
Next-Key Lock
算法保证在REPEATABLE-READ
的情况下就解决幻读,select * from table for update
3. 存储引擎
3.1 MyISAM
- 5.5 之前默认的存储引擎
- 并发性和锁级别 (对于读写混合的操作不好,为表级锁,写入和读互斥)
- 表损坏修复
- MyISAM 表支持的索引类型(全文索引)
- MyISAM 支持表压缩(压缩后,此表为只读,不可以写入。使用 myisampack 压缩)
3.2 InnoDB
- 5.5 及之后默认的存储引擎
- 支持事务
- 完全的支持 ACID
- Redo log(事务持久性)和 Undo log(事务的原子性,用于回滚)
- 支持行级锁,可以最大程度地支持并发
3.3 其他
- CSV:以 CSV 格式进行数据存储,列不能为 NULL,可以直接对数据文件进行编辑
- Memory:数据存在内存中,重启数据会丢失;支持 hash 索引和 btree 索引,所有字段都为固定长度,使用表级锁
4. log
4.1 binlog
binlog
记录了数据库的表结构和表数据变更,不会记录select
binlog
存储着每条变更 SQL 和事务 ID 等- 事务提交的时候才记录
- 主要作用:
- 复制:服务器需要与主服务器数据保持一致
- 恢复:恢复数据
4.2 redo log
- 修改的时候,写完内存了,还没到磁盘的时候磁盘挂了,这个时候可以根据
redo log
恢复 redo log
是顺序 IO,写入速度很快redo log
记录的是物理变化(XX 页做了 XX 修改),体积很小- 作用是为了持久化而生的
- 只有 InnoDB 有,在事务开始的时候就开始记录信息
- MySQL 通过两阶段提交保证
binlog
和redo log
数据一致- InnoDB
redo log
写盘,InnoDB 事务进入prepare
状态 binlog
写盘,InooDB 事务进入commit
状态- 每个事务
binlog
的末尾,会记录一个XID event
,标志着事务是否提交成功,也就是说,恢复过程中,binlog
最后一个XID event
之后的内容都应该被purge
。
- InnoDB
4.3 undo log
- 主要用来回滚和版本控制
- 主要存储的是逻辑日志