模拟面试|数据库面试思路一图懂
你好,我是大明,恭喜你学完第二章的内容,又到了要验收成果的时刻了。数据库这一章的内容很多,而且知识点都很重要,所以为了帮助你更好地掌握这部分内容,我们在这里设置了面试题。
你在回答的时候,最好是能够写成一个个文档,至少也要口头上说一遍。千万不要仅仅在脑海里面回忆一遍。因为在真正面试的时候,脑海中的记忆到嘴里说出的话,还需要一个转换。
10|数据库索引:为什么 MySQL 用 B+ 树而不用 B 树?
- 什么是覆盖索引?
- 什么是聚簇索引/非聚簇索引?
- 什么是哈希索引?MySQL InnoDB 引擎怎么创建一个哈希索引?
- 什么回表?如何避免回表?
- 树的高度和查询性能是什么关系?
- 什么是索引最左匹配原则?
- 范围查询、Like 之类的查询怎么影响数据库使用索引?
- 索引是不是越多越好?
- 使用索引有什么代价?
- 如何选择合适的索引列?组合索引里面怎么确定列的顺序?状态类的列是否适合作为索引的列?
- 为什么 MySQL 使用 B+ 树作为索引的数据结构?为什么不用 B 树?为什么不用红黑树?为什么不用二叉平衡树?为什么不用跳表?
- NULL 对索引有什么影响?
- 唯一索引是否允许多个NULL 值?
11|SQL 优化:如何发现 SQL 中的问题?
- 请你解释一下 EXPALIN 命令。
- 你有优化过 SQL 吗?具体是怎么优化的?
- 你有没有优化过索引?怎么优化的?
- 怎么优化 COUNT 查询?
- 怎么优化 ORDER BY?
- 怎么优化 LIMIT OFFSET 查询?
- 为什么要尽量把条件写到 WHERE 而不是写到 HAVING 里面?
- 怎么给一张表添加新的索引/修改表结构?如果我的数据量很大呢?
- USE INDEX/FORCE INDEX/IGNORE INDEX 有什么效果?
12|数据库锁:明明有行锁,怎么突然就加了表锁?
- 什么是行锁、表锁?什么时候加表锁?怎么避免?
- 什么是乐观锁?怎么在 MySQL 里面实现一个乐观锁?
- 什么是意向锁?可以举一个例子吗?
- 什么是共享锁和排它锁?它们有什么特性?
- 什么是两阶段加锁?
- 什么是记录锁、间隙锁和临键锁?
- RC 级别有间隙锁和临键锁吗?
- MySQL 是怎么在 RR 级别下解决幻读的?
- 什么情况下会加临键锁?什么情况下会加间隙锁?什么时候加记录锁?
- 唯一索引和普通索引会怎么影响锁?
- 你遇到过什么死锁问题吗?怎么排查的?最终又是怎么解决的?
- 你有没有优化过锁?怎么优化的?
13|MVCC协议:MySQL 修改数据时,还能不能读到这条数据?
- 什么是 MVCC?为什么需要 MVCC?
- 什么是隔离级别?隔离级别有哪几种?
- 什么是脏读、不可重复读、幻读?它们与隔离级别的关系是怎样的?
- 隔离级别是不是越高越好?
- 你们公司用的是什么隔离级别?为什么使用这个隔离级别?能不能使用别的隔离级别?
- 你有没有改过隔离级别?为什么改?
14|数据库事务:事务提交了,你的数据就一定不会丢吗?
- 什么是 undo log?为什么需要 undo log?
- 什么是 redo log?为什么需要 redo log?
- 什么是 binlog?它有几种模式?用来做什么?
- 事务是如何执行的?
- 什么是 ACID?隔离性和隔离级别是什么关系?你觉得哪个隔离级别满足这里的隔离性要求?
- redo log 的刷盘时机有哪些?该如何选择?你们公司用的是哪个配置?为什么用这个配置?
- binlog 的刷盘时机有哪些?该如何选择?你们公司用的是哪个配置?为什么用这个配置?
- 我的事务提交了,就一定不会丢吗?怎么确保一定不会丢?
- 什么是 page cache?为什么不直接写到磁盘?
- 在分布式环境下,当服务器告诉我写入成功的时候,一定写入成功了吗?如果服务器宕机了了可能发生什么?
15|数据迁移:如何在不停机的情况下保证迁移数据的一致性?
- 你们单库拆分的时候是如何做数据迁移的/你们修改大表结构的时候是怎么做数据迁移的?怎么在保持应用不停机的情况下做数据迁移?
- 什么是双写?为什么要引入双写?
- 如果双写的过程中,有一边写失败了,怎么办?
- 你可以用本地事务来保证双写要么都成功,要么都失败吗?分布式事务呢?
- 为什么有一个阶段是双写,但是以目标表为准?干嘛不直接切换到单写目标表?
- 你们有什么容错方案?比如说如果在迁移过程中出错了,你们的应用会怎么办?
- 你们是怎么校验数据的?
- 增量数据校验你们是怎么做的?
- 数据迁移你能够做到数据绝对不出错吗?
- 如果数据出错了你们怎么修复?怎么避免并发问题?
- 让你迁移一个 2000 万行的表,你的方案大概要多久?
- 你用过 mysqldump/XtraBackup 吗?它有什么缺点?
16|分库分表主键生成:如何设计一个主键生成算法?
- 你们分库分表怎么生成主键的?
- 使用 UUID/数据库自增/雪花算法有什么优缺点?
- 雪花算法是如何实现的?
- 雪花算法是怎么做到全局唯一的?
- 怎么解决雪花算法的序列号耗尽问题?
- 怎么解决雪花算法的数据堆积问题?
- 你有没有优化过主键生成的性能?怎么优化的?效果如何?
- 你的主键生成的 ID 是严格递增的吗?不是递增有什么问题?
- 为什么我们一般使用自增主键?
- 什么是页分裂?有什么缺点?
17|分库分表分页查询:为什么你的分页查询又慢又耗费内存?
- 你们公司是怎么解决分页查询的?平均查询性能如何?
- 为什么分页查询那么慢?
- 全局查询有什么优缺点?对于一个查询 LIMIT X OFFSET Y 来说,如果我命中了三张表,会取来多少数据?
- 怎么提高分页查询的速度?
- 什么是二次查询?它的步骤是什么样的?
- 怎么在二次查询里面计算全局的偏移量?
- 二次查询有什么优缺点?
- 代理形态的分库分表中间件有什么优缺点?怎么解决或者改进它的缺点?
- 使用中间表来进行分库分表,有什么优缺点?怎么设计中间表?
- 在使用中间表的时候,你怎么保证数据一致性?你能保证强一致吗?如果不能,不一致的时间最差是多久?
- 你们公司有没有考虑使用别的中间件来解决分页查询?你选择哪一个?为什么?
18|分库分表事务:如何同时保证分库分表、ACID及高性能?
- 你们公司在分库分表之后,如何解决事务问题?
- 什么是两阶段提交协议?有什么缺点?
- 什么是三阶段提交协议?相比两阶段,改进点在哪里?
- 什么是 XA 事务?
- 你觉得 XA 事务是否满足 ACID?为什么?
- 什么是 TCC?
- 什么是 SAGA?
- 什么是 AT 事务?
- 什么是延迟事务?延迟事务失败了怎么办?为什么分库分表中间件喜欢用延迟事务?
- 你们公司是否允许跨库事务?为什么?有什么场景是必须要使用跨库事务的?
19|分库分表无分库分表键查询:按买家分库分表,卖家怎么查?
- 你们公司的分库分表是怎么分的?一般情况下怎么选择分库分表键?
- 假设说现在我的订单表是按照买家 ID 来分库分表的,现在我卖家要查询,怎么办?
- 利用中间表来支持无分库分表键查询的时候,怎么设计中间表?
- 为什么在买家分库分表的时候,按照 4 8 32,但是同样的数据,按照卖家分库分表的时候,就只需要按照 2 8 16?
- 广播有什么缺点?
- 可以使用什么中间件来支持复杂查询?你们公司用了什么?
20|分库分表容量预估:分库分表时怎么计算所需库、表的数量?
- 你是怎么估计容量的?考虑了什么因素?
- 你怎么知道数据未来增长会有多快?
- 你这容量是预估了几年的数据量?为什么?
- 你是怎么利用流量录制和重放来验证数据的?
- 在流量录制之后,重放之前,如果数据修改了,你的数据校验还能正常运行吗?
- 你公司用的是 HTTPS 协议吗?使用 HTTPS 协议你怎么录制流量?
- 为什么大家都喜欢用 2 的幂来作为容量?
- 怎么扩容?有哪些步骤?
- 如果你发现之前分库分表分太多了,能不能缩容?假如要你缩容,你怎么办?
21|数据库综合应用:怎么保证数据库高可用、高性能?
- 你们有没有做过数据库优化?有没有做过 InnoDB 引擎优化?
- 你调过什么数据库相关的参数?为什么要调?
- InnoDB 引擎的 buffer pool 是拿来做什么的?怎么优化它的性能?
- buffer pool 是不是越大越好?过大或者过小都有什么问题?怎么确定合适的大小?
- 数据库里面有很多刷盘相关的参数,你都了解吗?调过吗?根据什么来调?
- 你有没有做过主从分离?主从延迟是什么?怎么解决主从延迟?
- 你们公司的数据库主节点宕机了会发生什么?
- 什么是查询缓存?你们公司有没有用查询缓存?
数据库面试一图懂
最后我将这节课的内容整理成了一张图片,图片能够更好地展现知识点之间的联系,你可以参考,如果你觉得有用的话,可以把这节课的内容分享给身边的朋友,邀他一起学习,共同进步。好了,我们下一章再见吧!