MySQL 基本概念
MyISAM:无事务、锁表、读写互相阻塞、索引不缓存数据、数据与索引分离,都是【非聚集索引】
InnoDB:有事务,默认用主键or唯一非空列or隐藏列建立【聚集索引】(只能有一个),索引和数据在同一个B(平衡)树,影响增改性能,速度快,特性如下:
- 插入缓冲(insert buffer)
- 两次写(double write)
- 自适应哈希索引(adaptive hash index,AHI)
- 异步IO(asynchronous IO,AIO)
- 刷新邻接页(flush neighbor page)
稠密索引、稀疏索引
下面三个是很常见的知识点,一定要反复复习记住
ACID
- 原子性 atomicity
- 一致性 consistency
- 隔离性 isolation
- 持久性 durability
隔离级别
隔离级别 | 脏读 | 不可重读 | 幻读 | 英文名 | 默认 |
---|---|---|---|---|---|
RU 读未提交 | √ | √ | √ | Read uncommitted | |
RC 读已提交 | × | √ | √ | Read committed | 其他 |
RR 可重读 | × | × | √ | Repeatable read | MySQL |
S 串行化 | × | × | × | Serializable |
- 读未提交 = 脏读,没有隔离性,Saga 分布式事务的缺点
- 读已提交 = 不可重读:更新,一个事务两次读取内容不一样
- 幻读:插入,一个事务两次读取条数不一样,MySQL 用 MVCC 解决
- 多版本并发控制 MVCC Multiversion Concurrency Control
- DB_TRX_ID 最近增改事务ID
- DB_ROLL_PTR 回滚指针,上一版本 0x...
- DB_ROW_ID 自增ID,没有主键时的聚簇索引
- DELETED_BIT 删除
CAP
- 一致性 Consistency
- 可用性 Availability
- 分区容错性 Partition tolerance
与缓存一致性
- 先更新数据库,避免刚删完缓存就被其他线程刷入旧数据
- 缓存使用删除而不是更新,避免更新时数据库内容已经变了