数据库
首页 > 数据库> > 35道MySQL面试必问题图解,这样也太好理解了吧

35道MySQL面试必问题图解,这样也太好理解了吧

作者:互联网

关于面试题的文章之前发过不少,但读者们给的反馈是普遍是理解难,看完就忘。所以今天我会用画图来给大家分析一下这35道题,希望能够加深你们的理解。

篇幅所限,本文先写MySQL的35问,其他的技术栈我也都整理好了,后面会持续更新,点个关注不迷路

当然我知道肯定有等不及的同学,所以我会把整理好的文档都无偿分享出来,如图

35道MySQL面试必问题图解,这样也太好理解了吧

 

领取方式:宫众号【不脱发有志青年】

好了,那废话不多说,我们一起来揭开这35道题的神秘面纱

1.说一说三大范式

但是在我们的日常开发当中,「并不是所有的表一定要满足三大范式」,有时候冗余几个字段可以少关联几张表,带来的查询效率的提升有可能是质变的

2.MyISAM 与 InnoDB 的区别是什么?

35道MySQL面试必问题图解,这样也太好理解了吧

 

3.为什么推荐使用自增 id 作为主键?

35道MySQL面试必问题图解,这样也太好理解了吧

 

4.一条查询语句是怎么执行的?

35道MySQL面试必问题图解,这样也太好理解了吧

 

5.使用 Innodb 的情况下,一条更新语句是怎么执行的?

用以下语句来举例,c 字段无索引,id 为主键索引

update T set c=c+1 where id=2;

6.Innodb 事务为什么要两阶段提交?

可以看到,「如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致」。

7.什么是索引?

相信大家小时候学习汉字的时候都会查字典,想想你查字典的步骤,我们是通过汉字的首字母 a~z 一个一个在字典目录中查找,最终找到该字的页数。想想,如果没有目录会怎么样,最差的结果是你有可能翻到字典的最后一页才找到你想要找的字。

索引就「相当于我们字典中的目录」,可以极大的提高我们在数据库的查询效率。

8.索引失效的场景有哪些?

以下随便列举几个,不同版本的 mysql 场景不一

select a from user where c > 5 and b = 4;

9.为什么采用 B+ 树,而不是 B-树

B+ 树只在叶子结点储存数据,非叶子结点不存具体数据,只存 key,查询更稳定,增大了广度,而一个节点就是磁盘一个内存页,内存页大小固定,那么相比 B 树,B- 树这些「可以存更多的索引结点」,宽度更大,树高矮,节点小,拉取一次数据的磁盘 IO 次数少,并且 B+ 树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,效率更高。

10.WAl 是什么?有什么好处?

WAL 就是 Write-Ahead Logging,其实就是「所有的修改都先被写入到日志中,然后再写磁盘」,用于保证数据操作的原子性和持久性。

好处:

11.什么是回表?

35道MySQL面试必问题图解,这样也太好理解了吧

 

回表就是先通过数据库索引扫描出该索引树中数据所在的行,取到主键 id,再通过主键 id 取出主键索引数中的数据,即基于非主键索引的查询需要多扫描一棵索引树.

12.什么是索引下推?

如果存在某些被索引的列的判断条件时,MySQL 将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合 MySQL 服务器传递的条件,「只有当索引符合条件时才会将数据检索出来返回给 MySQL 服务器」 。

13.什么是覆盖索引?

覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取,可以减少回表的次数。比如:

select id from t where age = 1;

id 为主键索引,age 为普通索引,age 这个索引树存储的就是逐渐信息,可以直接返回

14.什么是最左前缀原则?

最左前缀其实说的是,在 where 条件中出现的字段,「如果只有组合索引中的部分列,则这部分列的触发索引顺序」,是按照定义索引的时候的顺序从前到后触发,最左面一个列触发不了,之后的所有列索引都无法触发。

比如「有一个 (a,b,c) 的组合索引」

where a = 1 and b = 1

此时 a,b 会命中该组合索引

where a = 1 and c = 1

此时 a 会命中该组合索引, c 不会

where b = 1 and c = 1

此时不会命中该组合索引

15.普通索引和唯一索引该怎么选择?

所以「唯一索引更加适合查询的场景,普通索引更适合插入的场景」

16.什么是事务?其特性是什么?

事务是指是程序中一系列操作必须全部成功完成,有一个失败则全部失败。

35道MySQL面试必问题图解,这样也太好理解了吧

 

特性

17.事务的隔离级别?

35道MySQL面试必问题图解,这样也太好理解了吧

 

18.binlog 是做什么的?

binlog 是归档日志,属于 Server 层的日志,是一个二进制格式的文件,用于「记录用户对数据库更新的SQL语句信息」。

主要作用

19.undolog 是做什么的?

undolog 是 InnoDB 存储引擎的日志,用于保证数据的原子性,「保存了事务发生之前的数据的一个版本,也就是说记录的是数据是修改之前的数据,可以用于回滚」,同时可以提供多版本并发控制下的读(MVCC)。

主要作用

20.relaylog 是做什么的?

relaylog 是中继日志,「在主从同步的时候使用到」,它是一个中介临时的日志文件,用于存储从master节点同步过来的binlog日志内容。

35道MySQL面试必问题图解,这样也太好理解了吧

 

master 主节点的 binlog 传到 slave 从节点后,被写入 relay log 里,从节点的 slave sql 线程从 relaylog 里读取日志然后应用到 slave 从节点本地。从服务器 I/O 线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后 SQL 线程会读取 relay-log 日志的内容并应用到从服务器,从而「使从服务器和主服务器的数据保持一致」。

21.redolog 是做什么的?

redolog 是 「InnoDB 存储引擎所特有的一种日志」,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。

可以做「数据恢复并且提供 crash-safe 能力」

当有增删改相关的操作时,会先记录到 Innodb 中,并修改缓存页中的数据,「等到 mysql 闲下来的时候才会真正的将 redolog 中的数据写入到磁盘当中」。

22.redolog 是怎么记录日志的?

35道MySQL面试必问题图解,这样也太好理解了吧

 

InnoDB 的 redo log 是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共就可以记录4GB的操作。「从头开始写,写到末尾就又回到开头循环写」。

所以,如果数据写满了但是还没有来得及将数据真正的刷入磁盘当中,那么就会发生「内存抖动」现象,从肉眼的角度来观察会发现 mysql 会宕机一会儿,此时就是正在刷盘了。

23.redolog 和 binlog 的区别是什么?

35道MySQL面试必问题图解,这样也太好理解了吧

 

24.说一说 mvcc 吧,有什么作用?

MVCC:多版本并发控制,是现代数据库(包括 MySQL、Oracle、PostgreSQL 等)引擎实现中常用的处理读写冲突的手段,目的在于「提高数据库高并发场景下的吞吐性能」。

在 MVCC 协议下,每个读操作会看到一个一致性的快照,「这个快照是基于整个库的」,并且可以实现非阻塞的读,用于「支持读提交和可重复读隔离级别的实现」。

MVCC 允许数据具有多个版本,这个版本可以是时间戳或者是全局递增的事务 ID,在同一个时间点,不同的事务看到的数据是不同的,这个修改的数据是「记录在 undolog 中」的。

25.一条 Sql 语句查询一直慢会是什么原因?

35道MySQL面试必问题图解,这样也太好理解了吧

 

26.一条 Sql 语句查询偶尔慢会是什么原因?

35道MySQL面试必问题图解,这样也太好理解了吧

 

27.Mysql 主从之间是怎么同步数据的?

35道MySQL面试必问题图解,这样也太好理解了吧

 

「同步策略」:

28.主从延迟要怎么解决?

29.删除表数据后表的大小却没有变动,这是为什么?

在使用 delete 删除数据时,其实对应的数据行并不是真正的删除,是「逻辑删除」,InnoDB 仅仅是将其「标记成可复用的状态」,所以表空间不会变小

30.为什么 VarChar 建议不要超过255?

35道MySQL面试必问题图解,这样也太好理解了吧

 

当定义varchar长度小于等于255时,长度标识位需要一个字节(utf-8编码)

当大于255时,长度标识位需要两个字节,并且建立的「索引也会失效」

31.分布式式事务怎么实现?

七种分布式事务的解决方案,一次讲给你听

32.Mysql 中有哪些锁?

以下并不全,主要理解下锁的意义即可

33.为什么不要使用长事务?

35道MySQL面试必问题图解,这样也太好理解了吧

 

34.buffer pool 是做什么的?

buffer pool 是一块内存区域,为了「提高数据库的性能」,当数据库操作数据的时候,把硬盘上的数据加载到 buffer pool,不直接和硬盘打交道,操作的是 buffer pool 里面的数据,数据库的增删改查都是在 buffer pool 上进行

buffer pool 里面缓存的数据内容也是一个个数据页

其中「有三大双向链表」:

预读机制:

35.说说你的 Sql 调优思路吧

35道MySQL面试必问题图解,这样也太好理解了吧

 

搜索

复制

标签:binlog,事务,35,索引,MySQL,日志,图解,数据,主键
来源: https://www.cnblogs.com/hwlwiehjdid/p/16439449.html