【MYSQL】纯干货!面试题:InnoDB!完全解析!建议收藏!

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锁

面试侧重点

  • 基本的查询语法
  • 索引
  • 存储结构建议在索引的时候自己带出来点,给自己创造一些亮点

你可能感兴趣的:(#,数据库,MYSQL,mysql,sql,数据库,新星计划)