InnoDB 架构
下图是官方文档给出的InnoDB存储结构
InnoDB的日志先行策略,按照内存到磁盘的顺序对数据进行处理。
其中的优点有以下几点
- 内存中操作完成就可以返回成功,执行效率高
- 就算是数据落回磁盘过程中断电也能通过redo日志找回
- InnoDB的缓存池通过页链表实现,效率高
InnoDB的磁盘中的存储有以下特点,我做了简化直接突出重点,方便大家记忆
- InnoDB表的限制:一个表的辅助索引最多64个,一行大小最多65535,组合索引最多16个字段
- 表空间
- 系统表空间
- File-Per-Table 表空间
- Undo表空间
- 临时表空间
索引
InnoDB中通过索引组织表存放索引。
InnoDB中主键索引使用的是B+索引
B+树的特点
- 每个非叶子节点只存储键值,不存储数据
- 一般的高度为2-4层,所以查找速度很快
辅助索引有被称为非聚集索引,辅助索引存储的是主键的值,当拿到主键的值之后再去查找数据的过程被称为回表。
如果人家问你回表,可以按照回表-辅助索引-索引的逻辑解释。
覆盖索引指的是辅助索引能找到要找的列,而不需要回表。
联合索引的顺序很重要,所以我们在创建索引的过程中需要注意列的顺序。
事务
ACID
- 原子性:Atomicity
- 一致性:Consistency
- 隔离性:Isolation
- 持久性:Durability
事务隔离级别有4种,InnoDB默认支持REPEATABLE READ。
InnoDB通过redo日志实现事务,redo日志是存储在磁盘的物理操作日志。
binlog是维护日志一致性在内存里的逻辑日志。
脏读是指一个事务提交之前,另一个事务来读取数据造成的数据不一致。
幻读问题就是一个事务中同一个SQL多次执行,结果集不同。
锁
Innodb支持行级锁。
行级锁分为共享锁和排他锁。
- 共享锁(S锁),只可以读,不可以修改
- 排它锁(X锁),不可读也不可写
意向锁(Intention Locks)
- 意向共享锁(IS),加行共享锁之前需要得到的锁
- 意向排他锁(IX),加行排他锁之前需要得到锁
行锁的存储结构
typedef struct lock_rec_struct lock_rec_t struct lock_rec_struct{ ulint space; /*space id*/ ulint page_no; /*page number*/ unint n_bits; /*number of bits in the lock bitmap*/ }
加锁逻辑:加锁-唯一索引的冲突检查-判断Gap锁或Next-Key锁-加X锁
面试侧重点
- 基本的查询语法
- 索引
- 锁
- 存储结构建议在索引的时候自己带出来点,给自己创造一些亮点