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

举报
小雨青年 发表于 2022/03/29 00:50:42 2022/03/29
【摘要】 InnoDB 架构 下图是官方文档给出的InnoDB存储结构 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*/
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

加锁逻辑:加锁-唯一索引的冲突检查-判断Gap锁或Next-Key锁-加X锁

面试侧重点

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

文章来源: coderfix.blog.csdn.net,作者:小雨青年,版权归原作者所有,如需转载,请联系作者。

原文链接:coderfix.blog.csdn.net/article/details/117637334

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。