数据库精选 60 道面试题

大家好,我是贺同学。

金三银四到了,给大家整理一些数据库必知必会的面试题。


基础相关

1、关系型和非关系型数据库的区别?

关系型数据库的优点

非关系型数据库(NOSQL)的优点

2、详细说一下一条 MySQL 语句执行的步骤

Server 层按顺序执行 SQL 的步骤为:

索引相关

3、MySQL 使用索引的原因?

根本原因

扩展

4、索引的三种常见底层数据结构以及优缺点

三种常见的索引底层数据结构:分别是哈希表、有序数组和搜索树。

5、索引的常见类型以及它是如何发挥作用的?

根据叶子节点的内容,索引类型分为主键索引和非主键索引。

6、MyISAM 和 InnoDB 实现 B 树索引方式的区别是什么?

7、InnoDB 为什么设计 B+ 树索引?

两个考虑因素:

为什么选择 B+ 树:

8、什么是覆盖索引和索引下推?

覆盖索引:

索引下推:

9、哪些操作会导致索引失效?

10、字符串加索引

日志相关

11、MySQL 的 change buffer 是什么?

12、MySQL 是如何判断一行扫描数的?

13、MySQL 的 redo log 和 binlog 区别?


数据库精选 60 道面试题


14、为什么需要 redo log?

15、为什么 redo log 具有 crash-safe 的能力,是 binlog 无法替代的?

第一点:redo log 可确保 innoDB 判断哪些数据已经刷盘,哪些数据还没有

第二点:如果 redo log 写入失败,说明此次操作失败,事务也不可能提交

16、当数据库 crash 后,如何恢复未刷盘的数据到内存中?

根据 redo log 和 binlog 的两阶段提交,未持久化的数据分为几种情况:

17、redo log 写入方式?

redo log包括两部分内容,分别是内存中的日志缓冲(redo log buffer)和磁盘上的日志文件(redo log file)。

MySQL 每执行一条 DML 语句,会先把记录写入 redo log buffer(用户空间) ,再保存到内核空间的缓冲区 OS-buffer 中,后续某个时间点再一次性将多个操作记录写到 redo log file(刷盘) 。这种先写日志,再写磁盘的技术,就是WAL

数据库精选 60 道面试题

可以发现,redo log buffer写入到redo log file,是经过OS buffer中转的。其实可以通过参数innodb_flush_log_at_trx_commit进行配置,参数值含义如下:

18、redo log 的执行流程?

我们来看下Redo log的执行流程,假设执行的 SQL 如下:

update T set a =1 where id =666
数据库精选 60 道面试题

  1. MySQL 客户端将请求语句 update T set a =1 where id =666,发往 MySQL Server 层。
  2. MySQL Server 层接收到 SQL 请求后,对其进行分析、优化、执行等处理工作,将生成的 SQL 执行计划发到 InnoDB 存储引擎层执行。
  3. InnoDB 存储引擎层将a修改为1的这个操作记录到内存中。
  4. 记录到内存以后会修改 redo log 的记录,会在添加一行记录,其内容是需要在哪个数据页上做什么修改
  5. 此后,将事务的状态设置为 prepare ,说明已经准备好提交事务了。
  6. 等到 MySQL Server 层处理完事务以后,会将事务的状态设置为 commit,也就是提交该事务。
  7. 在收到事务提交的请求以后,redo log 会把刚才写入内存中的操作记录写入到磁盘中,从而完成整个日志的记录过程。

19、binlog 的概念是什么,起到什么作用, 可以保证 crash-safe 吗?

20、什么是两阶段提交?

MySQL 将 redo log 的写入拆成了两个步骤:prepare 和 commit,中间再穿插写入binlog,这就是"两阶段提交"。

数据库精选 60 道面试题

而两阶段提交就是让这两个状态保持逻辑上的一致。redolog 用于恢复主机故障时的未更新的物理数据,binlog 用于备份操作。两者本身就是两个独立的个体,要想保持一致,就必须使用分布式事务的解决方案来处理。

为什么需要两阶段提交呢?

在恢复数据时,redolog 状态为 commit 则说明 binlog 也成功,直接恢复数据;如果 redolog 是 prepare,则需要查询对应的 binlog事务是否成功,决定是回滚还是执行。

21、MySQL 怎么知道 binlog 是完整的?

一个事务的 binlog 是有完整格式的:

22、什么是 WAL 技术,有什么优点?

WAL,中文全称是 Write-Ahead Logging,它的关键点就是日志先写内存,再写磁盘。MySQL 执行更新操作后,在真正把数据写入到磁盘前,先记录日志

好处是不用每一次操作都实时把数据写盘,就算 crash 后也可以通过redo log 恢复,所以能够实现快速响应 SQL 语句。

23、binlog 日志的三种格式

binlog 日志有三种格式

Statement格式

每一条会修改数据的 SQL 都会记录在 binlog 中

Row格式

不记录 SQL 语句上下文相关信息,仅保存哪条记录被修改。

Mixed格式

实际上就是 Statement 与 Row 的结合。一般的语句修改使用 statment 格式保存 binlog,如一些函数,statement 无法完成主从复制的操作,则采用 row 格式保存 binlog,MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式。

24、redo log日志格式

数据库精选 60 道面试题

redo log buffer (内存中)是由首尾相连的四个文件组成的,它们分别是:ib_logfile_1、ib_logfile_2、ib_logfile_3、ib_logfile_4。

25、原本可以执行得很快的 SQL 语句,执行速度却比预期的慢很多,原因是什么?如何解决?

原因:从大到小可分为四种情况

解决:

26、InnoDB 数据页结构

一个数据页大致划分七个部分

数据相关

27、MySQL 是如何保证数据不丢失的?

28、误删数据怎么办?

DBA 的最核心的工作就是保证数据的完整性,先要做好预防,预防的话大概是通过这几个点:

29、drop、truncate 和 delete 的区别

30、在 MySQL 中有两个 kill 命令

kill 不掉的原因

31、如何理解 MySQL 的边读边发

32、MySQL 的大表查询为什么不会爆内存?

33、MySQL 临时表的用法和特性

34、MySQL 存储引擎介绍(InnoDB、MyISAM、MEMORY)

35、都说 InnoDB 好,那还要不要使用 MEMORY 引擎?

36、如果数据库误操作, 如何执行数据恢复?

数据库在某个时候误操作,就可以找到距离误操作最近的时间节点的bin log,重放到临时数据库里,然后选择误删的数据节点,恢复到线上数据库。

主从备份相关

37、MySQL 是如何保证主备同步?

主备关系的建立:

MySQL 主备切换流程:

一个事务完整的同步过程:

38、什么是主备延迟

主库和备库在执行同一个事务的时候出现时间差的问题,主要原因有:

39、为什么要有多线程复制策略?

40、MySQL 的并行策略有哪些?

41、MySQL的一主一备和一主多从有什么区别?

在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。

42、主库出问题如何解决?

43、MySQL 读写分离涉及到过期读问题的几种解决方案?

44、MySQL的并发链接和并发查询有什么区别?

性能相关

45、短时间提高 MySQL 性能的方法

46、为什么 MySQL 自增主键 ID 不连续?

47、InnoDB 为什么要用自增 ID 作为主键?

48、如何最快的复制一张表?

49、grant 和 flush privileges语句

50、要不要使用分区表?

51、join 用法

52、MySQL 有哪些自增ID?各自场景是什么?

53、Xid 在 MySQL 内部是怎么生成的呢?

MySQL 内部维护了一个全局变量 global_query_id,每次执行语句(包括select语句)的时候将它赋值给 Query_id,然后给这个变量加 1。如果当前语句是这个事务执行的第一条语句,那么 MySQL 还会同时把 Query_id 赋值给这个事务的 Xid。

而 global_query_id 是一个纯内存变量,重启之后就清零了。所以你就知道了,在同一个数据库实例中,不同事务的 Xid 也是有可能相同的。但是 MySQL 重启之后会重新生成新的 binlog 文件,这就保证了,同一个 binlog 文件里,Xid 一定是惟一的。

锁相关

54、说一下 MySQL 的锁

55、什么是幻读?

值在同一个事务中,存在前后两次查询同一个范围的数据,第二次看到了第一次没有查询到的数据。

幻读出现的场景:

幻读带来的问题:

解决:

其它为什么系列

56、为什么 MySQL 会抖一下?

57、为什么删除了表,表文件的大小还是没变?

58、count(*)实现方式以及各种 count 对比

59、orderby 排序内部原理

60、如何高效的使用 MySQL 显式随机消息

持续更新中。

参考:

转载自:微信公众号,herongwei

展开阅读全文

页面更新:2024-05-01

标签:字段   线程   语句   索引   内存   事务   操作   数据库   引擎   数据   日志

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top