模拟面试|数据库面试思路一图懂

思考并回答以下问题:

你在回答的时候,最好是能够写成一个个文档,至少也要口头上说一遍。千万不要仅仅在脑海里面回忆一遍。因为在真正面试的时候,脑海中的记忆到嘴里说出的话,还需要一个转换。

10|数据库索引:为什么MySQL用B+树而不用B树?

1,什么是覆盖索引?

2,什么是聚簇索引/非聚簇索引?

3,什么是哈希索引?MySQL InnoDB引擎怎么创建一个哈希索引?

4,什么回表?如何避免回表?

5,树的高度和查询性能是什么关系?

6,什么是索引最左匹配原则?

7,范围查询、Like之类的查询怎么影响数据库使用索引?

8,索引是不是越多越好?

9,使用索引有什么代价?

10,如何选择合适的索引列?组合索引里面怎么确定列的顺序?状态类的列是否适合作为索引的列?

11,为什么MySQL使用B+树作为索引的数据结构?为什么不用B树?为什么不用红黑树?为什么不用二叉平衡树?为什么不用跳表?

12,NULL对索引有什么影响?

13,唯一索引是否允许多个NULL值?

11|SQL优化:如何发现SQL中的问题?

1,请你解释一下EXPALIN命令。

2,你有优化过SQL吗?具体是怎么优化的?

3,你有没有优化过索引?怎么优化的?

4,怎么优化COUNT查询?

5,怎么优化ORDER BY?

6,怎么优化LIMIT OFFSET查询?

7,为什么要尽量把条件写到WHERE而不是写到HAVING里面?

8,怎么给一张表添加新的索引/修改表结构?如果我的数据量很大呢?

9,USE INDEX/FORCE INDEX/IGNORE INDEX有什么效果?

12|数据库锁:明明有行锁,怎么突然就加了表锁?

1,什么是行锁、表锁?什么时候加表锁?怎么避免?

2,什么是乐观锁?怎么在MySQL里面实现一个乐观锁?

3,什么是意向锁?可以举一个例子吗?

4,什么是共享锁和排它锁?它们有什么特性?

5,什么是两阶段加锁?

6,什么是记录锁、间隙锁和临键锁?

7,RC级别有间隙锁和临键锁吗?

8,MySQL是怎么在RR级别下解决幻读的?

9,什么情况下会加临键锁?什么情况下会加间隙锁?什么时候加记录锁?

10,唯一索引和普通索引会怎么影响锁?

11,你遇到过什么死锁问题吗?怎么排查的?最终又是怎么解决的?

12,你有没有优化过锁?怎么优化的?

13|MVCC协议:MySQL修改数据时,还能不能读到这条数据?

1,什么是MVCC?为什么需要MVCC?

2,什么是隔离级别?隔离级别有哪几种?

3,什么是脏读、不可重复读、幻读?它们与隔离级别的关系是怎样的?

4,隔离级别是不是越高越好?

5,你们公司用的是什么隔离级别?为什么使用这个隔离级别?能不能使用别的隔离级别?

6,你有没有改过隔离级别?为什么改?

14|数据库事务:事务提交了,你的数据就一定不会丢吗?

1,什么是undo log?为什么需要undo log?

2,什么是redo log?为什么需要redo log?

3,什么是binlog?它有几种模式?用来做什么?

4,事务是如何执行的?

5,什么是ACID?隔离性和隔离级别是什么关系?你觉得哪个隔离级别满足这里的隔离性要求?

6,redo log的刷盘时机有哪些?该如何选择?你们公司用的是哪个配置?为什么用这个配置?

7,binlog的刷盘时机有哪些?该如何选择?你们公司用的是哪个配置?为什么用这个配置?

8,我的事务提交了,就一定不会丢吗?怎么确保一定不会丢?

9,什么是page cache?为什么不直接写到磁盘?

10,在分布式环境下,当服务器告诉我写入成功的时候,一定写入成功了吗?如果服务器宕机了了可能发生什么?

15|数据迁移:如何在不停机的情况下保证迁移数据的一致性?

1,你们单库拆分的时候是如何做数据迁移的/你们修改大表结构的时候是怎么做数据迁移的?怎么在保持应用不停机的情况下做数据迁移?

2,什么是双写?为什么要引入双写?

3,如果双写的过程中,有一边写失败了,怎么办?

4,你可以用本地事务来保证双写要么都成功,要么都失败吗?分布式事务呢?

5,为什么有一个阶段是双写,但是以目标表为准?干嘛不直接切换到单写目标表?

6,你们有什么容错方案?比如说如果在迁移过程中出错了,你们的应用会怎么办?

7,你们是怎么校验数据的?

8,增量数据校验你们是怎么做的?

9,数据迁移你能够做到数据绝对不出错吗?

10,如果数据出错了你们怎么修复?怎么避免并发问题?

11,让你迁移一个2000万行的表,你的方案大概要多久?

12,你用过mysqldump/XtraBackup吗?它有什么缺点?

16|分库分表主键生成:如何设计一个主键生成算法?

1,你们分库分表怎么生成主键的?

2,使用UUID/数据库自增/雪花算法有什么优缺点?

3,雪花算法是如何实现的?

4,雪花算法是怎么做到全局唯一的?

5,怎么解决雪花算法的序列号耗尽问题?

6,怎么解决雪花算法的数据堆积问题?

7,你有没有优化过主键生成的性能?怎么优化的?效果如何?

8,你的主键生成的ID是严格递增的吗?不是递增有什么问题?

9,为什么我们一般使用自增主键?

10,什么是页分裂?有什么缺点?

17|分库分表分页查询:为什么你的分页查询又慢又耗费内存?

1,你们公司是怎么解决分页查询的?平均查询性能如何?

2,为什么分页查询那么慢?

3,全局查询有什么优缺点?对于一个查询LIMITXOFFSETY来说,如果我命中了三张表,会取来多少数据?

4,怎么提高分页查询的速度?

5,什么是二次查询?它的步骤是什么样的?

6,怎么在二次查询里面计算全局的偏移量?

7,二次查询有什么优缺点?

8,代理形态的分库分表中间件有什么优缺点?怎么解决或者改进它的缺点?

9,使用中间表来进行分库分表,有什么优缺点?怎么设计中间表?

10,在使用中间表的时候,你怎么保证数据一致性?你能保证强一致吗?如果不能,不一致的时间最差是多久?

11,你们公司有没有考虑使用别的中间件来解决分页查询?你选择哪一个?为什么?

18|分库分表事务:如何同时保证分库分表、ACID及高性能?

1,你们公司在分库分表之后,如何解决事务问题?

2,什么是两阶段提交协议?有什么缺点?

3,什么是三阶段提交协议?相比两阶段,改进点在哪里?

4,什么是XA事务?

5,你觉得XA事务是否满足ACID?为什么?

6,什么是TCC?

7,什么是SAGA?

8,什么是AT事务?

9,什么是延迟事务?延迟事务失败了怎么办?为什么分库分表中间件喜欢用延迟事务?

10,你们公司是否允许跨库事务?为什么?有什么场景是必须要使用跨库事务的?

19|分库分表无分库分表键查询:按买家分库分表,卖家怎么查?

1,你们公司的分库分表是怎么分的?一般情况下怎么选择分库分表键?

2,假设说现在我的订单表是按照买家ID来分库分表的,现在我卖家要查询,怎么办?

3,利用中间表来支持无分库分表键查询的时候,怎么设计中间表?

4,为什么在买家分库分表的时候,按照4832,但是同样的数据,按照卖家分库分表的时候,就只需要按照2816?

5,广播有什么缺点?

6,可以使用什么中间件来支持复杂查询?你们公司用了什么?

20|分库分表容量预估:分库分表时怎么计算所需库、表的数量?

1,你是怎么估计容量的?考虑了什么因素?

2,你怎么知道数据未来增长会有多快?

3,你这容量是预估了几年的数据量?为什么?

4,你是怎么利用流量录制和重放来验证数据的?

5,在流量录制之后,重放之前,如果数据修改了,你的数据校验还能正常运行吗?

6,你公司用的是HTTPS协议吗?使用HTTPS协议你怎么录制流量?

7,为什么大家都喜欢用2的幂来作为容量?

8,怎么扩容?有哪些步骤?

9,如果你发现之前分库分表分太多了,能不能缩容?假如要你缩容,你怎么办?

21|数据库综合应用:怎么保证数据库高可用、高性能?

1,你们有没有做过数据库优化?有没有做过InnoDB引擎优化?

2,你调过什么数据库相关的参数?为什么要调?

3,InnoDB引擎的buffer pool是拿来做什么的?怎么优化它的性能?

4,buffer pool是不是越大越好?过大或者过小都有什么问题?怎么确定合适的大小?

5,数据库里面有很多刷盘相关的参数,你都了解吗?调过吗?根据什么来调?

6,你有没有做过主从分离?主从延迟是什么?怎么解决主从延迟?

7,你们公司的数据库主节点宕机了会发生什么?

8,什么是查询缓存?你们公司有没有用查询缓存?

0%