资讯动态

数据库面试高频考点全解析:从B+树到分库分表的完整链路

发布时间:2026/10/5 3:32:56 来源:尧图企业网站定制
面试季又到了最近好几个准备跳槽的朋友都在问我同一个问题数据库面试题到底怎么准备市面上资料要么厚得像字典、看完前两章就放弃要么只剩题目和答案、完全不知道怎么应对考官的连环追问。我自己既做过候选人也坐在面试官那一侧问过不少人一个很真实的感受是数据库面试的核心从来不是考察你背了多少名词而是看你在一个知识点上能不能扛住往深里挖。这篇文章就把我在面试中反复遇到的高频考点串成几条主线——索引、事务、锁、SQL优化、主从复制、分库分表再加上连接池、缓存一致性这些容易被忽略的周边题每一条都给你一句话答案 深挖链路让你在短时间内把最关键的骨架建立起来。1. 面试官问数据库核心就在这几条主线数据库面试题看起来又多又杂从MySQL到SQLite、从Redis到向量数据库好像什么都可能被问到。但我被问过、也问过别人这么多年发现真正高频的考点其实是有一条清晰主线的先把这条线捋清楚复习效率会翻倍。1.1 数据库面试不是背概念是考能不能扛住追问面试官很少会直接甩一个什么是B树这种生硬的问题更多是从一个简单问题开始然后一步步往下挖挖到你答不上来为止。比如先问MySQL索引底层用的什么结构你答B树他接着问为什么不用二叉树、B树和B树的区别是什么、三层B树大概能存多少数据、叶子节点存的是什么、为什么会回表。这一串下来你到底是看过几篇博客、还是真在业务里研究过索引三句话就暴露了。所以准备面试题的时候千万不要只记结论。每一个高频考点都要准备一条追问链至少能往深挖两层。你答出为什么面试官就会觉得你有真实的项目经验你答不出哪怕结论背得再熟也容易被判定为八股文选手。1.2 高频考点地图我把这些年看到的数据库面试题做了一个归类大部分题目都逃不出下面这张表考点方向常见问法容易往哪个方向追问索引为什么用B树索引失效、最左前缀、回表、覆盖索引事务ACID是什么隔离级别、脏读幻读、MVCC实现锁行锁和表锁区别间隙锁、死锁场景、锁的兼容矩阵SQL优化慢SQL怎么处理explain字段、深分页、索引下推架构主从复制原理延迟问题、读写分离、数据一致性分库分表为什么分表分片键、分布式ID、分布式事务周边生态Redis与MySQL一致性问题缓存穿透、击穿、雪崩如果你时间非常紧优先把索引和事务这两块吃透。我面过的人里十个有八个第一轮都挂在这两个方向上。1.3 一条主线贯穿从一条SQL到整个系统其实数据库面试还有一个隐藏逻辑——所有问题都是一条SQL的放大版。用户点了一个按钮应用从连接池拿到连接把SQL发给MySQL解析器做语法解析优化器决定走哪个索引执行器加锁、读Buffer Pool、写undo log和redo log最后返回结果如果是写操作还要同步到从库、淘汰或更新缓存。面试中的索引、事务、锁、优化、主从复制、缓存一致性全部都是这条链路里的某一个环节。我建议你复习的时候脑子里始终带着这条链路。面试官问任何一个点你都可以把它放回链路里说清楚这个环节解决的是什么问题、上游是什么、下游是什么。比如问锁你可以说锁是为了在并发读写时保证数据一致它发生在执行器阶段和事务的隔离级别是配合工作的。这样你的回答会显得非常有体系感。2. 索引与事务被问概率最高的两块硬骨头如果说数据库面试有什么必考题那一定是索引和事务。这两个方向几乎每次面试都会被问到而且经常连着问。这一节我把它们背后的原理、常见的坑、以及速记要点写清楚。2.1 索引为什么用B树从数据页到磁盘IO的底层逻辑先给一句话答案B树能让磁盘IO次数保持在非常低的层级同时天然支持范围查询。很多人背了B树矮胖、查询快但一被追问为什么矮胖就快就卡住了。这里要理解两个背景。第一磁盘的速度和内存差了好几个数量级而且机械硬盘最怕随机IO连续读比随机读快得多。第二数据库读写的最小单位不是一行记录而是数据页InnoDB默认每页16KB。一次磁盘IO至少把一个页读进内存。B树之所以胜出是因为它的每个节点可以存很多个key和指针。假设一个key占8字节、一个指针占8字节一个16KB的页大约能存1000个kv组合那么两层分支就是1000×1000100万个数据三层就是1000×1000×100010亿级别。扣掉页的头部浪费和最小记录限制三层B树存2000万行数据是完全可行的。也就是说哪怕一张两千万行的表你按主键查找也只需要3次磁盘IO。换成二叉树呢两千万行大概需要24层也就是24次随机IO性能差距是灾难性的。B树还有一个杀手级特性叶子节点之间是一个双向链表。这意味着查某一条记录之后继续往后扫非常便宜比如where id between 500 and 1000找到500之后直接沿着链表往后遍历就行。B树就不行它的叶子节点没有这个链表范围查询就要反复回溯父节点效率差很多。面试里还常问聚簇索引和非聚簇索引。一句话版InnoDB里主键就是聚簇索引叶子节点直接存整行数据非聚簇索引二级索引的叶子节点存的是索引列主键值。所以用非聚簇索引查找时如果select的列不在索引里就要拿着主键再去聚簇索引查一次这个过程叫回表。能避免回表就尽量用覆盖索引也就是让select的列全部包含在索引里。2.2 最左前缀与索引失效两个必背但容易混淆的点联合索引的最左前缀原则我建议这样记联合索引像一本电话簿先按姓排序、再按名排序。你用姓查很快用姓名查很快直接按名查没戏——必须从最左边开始匹配。具体来说(a, b, c)这个联合索引能用到的场景是where a1、where a1 and b2、where a1 and b2 and c3。但where b2用不上where a1 and c3只能用上ac用不上因为中间断了。还有一种经典场景是范围查询where a1 and b2 and c3b用了范围之后c就没办法走索引了因为b的取值是一个区间区间内c是无序的。索引失效的问题也常被拿来挖坑。最典型的几个对索引列使用函数或计算比如where DATE(create_time)2026-01-01索引会失效正确写法是create_time 2026-01-01 and create_time 2026-01-02。隐式类型转换也会失效比如索引列是varchar查询条件是数字MySQL会先转换再比较。还有like %abc前缀没有确定值走不了索引or连接的多个条件里如果有一个没有索引整个查询可能全表扫。2.3 事务ACID与隔离级别从脏读、幻读到MVCC事务这块面试官最喜欢问的是ACID分别是什么脏读、不可重复读、幻读有什么区别四种隔离级别分别解决什么问题ACID是原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability。从这里开始就可以展示深度了原子性靠undo log保证持久性靠redo log保证隔离性靠锁和MVCC保证一致性是最终目标是前面三个特性共同作用的结果。隔离级别从低到高是Read Uncommitted、Read CommittedRC、Repeatable ReadRR、Serializable。最低的RU会读到别人没提交的数据这叫脏读。RC解决脏读但一个事务内两次读同一行值可能不一样这叫不可重复读。RR解决不可重复读但依然可能出现幻读——两次查询中另一个事务插入了一些新行导致两次返回的结果集行数不同。MySQL默认的隔离级别是RR但它其实用MVCC把普通的快照读幻读问题也解决了。要理解这个需要往下看MVCC。2.4 MVCC的可见性判断undo log与Read View简析MVCC多版本并发控制原理可以拆成几块。InnoDB的每条记录背后有两个隐藏字段trx_id表示最近一次修改这条记录的事务IDroll_pointer指向undo log里的上一个版本。更新的时候不是直接覆盖而是生成一个新版本旧版本留在undo log链里新版本的roll_pointer指回去。当一个事务做普通的select快照读时它会生成一个Read View里面记着当前活跃事务列表、最小的活跃事务ID、最大的事务ID、创建这个视图的事务ID。看一条记录是否可见核心规则是如果记录的trx_id不在活跃事务列表里、而且小于最大事务ID说明这个事务已经提交了可见如果trx_id是当前事务自己当然可见如果是最小事务ID之后的未提交事务不可见那就沿着undo log链找上一个版本继续判断。RC和RR的区别就在这里。RC是每次select都会生成一个新的Read View所以两次select之间如果别的事务提交了结果可能不同就出现了不可重复读。RR只在第一次select时生成Read View之后整个事务都复用这一个视图所以看到的数据始终是事务开始时的快照可重复读就实现了普通select的幻读也被顺带解决。但注意这只解决快照读的幻读。如果是select ... for update这种当前读MVCC帮不上忙要靠间隙锁。3. SQL优化一条慢SQL的完整排查链路面试中SQL优化一定会出现而且通常是以你有没有遇到过一条慢SQL是怎么处理的这种开放题的形式。这种问题没有标准答案面试官就是想看你的排查思路。我拿一个真实场景把整条链路走一遍。3.1 以一次线上慢查询为例定位、explain、优化之前我们有一个订单查询接口某天监控报警说接口平均耗时涨到了2.3秒。我当时的第一步不是去看代码而是先看数据库侧。开启慢查询日志之后很快抓到一条SQL大概是这样的查某个商户某个月的订单列表按创建时间倒序还要关联订单明细表。单独执行一次确实要2秒多。接下来用EXPLAIN看执行计划结果很典型订单表这一行的typeALL也就是全表扫描rows显示约500万订单明细表是typeref但Extra里有Using temporary和Using filesort。问题就很清楚了主表全表扫还要临时表排序不慢才怪。优化方向也清晰了给merchant_id和create_time建一个联合索引。因为查询条件是商户和时间范围排序也是时间倒序联合索引既能过滤又能避免filesort。改完之后type从ALL变成rangerows从500万降到几千接口耗时掉到几十毫秒。3.2 explain执行计划关键字段怎么看面试里经常会直接让你解释explain的输出所以这几个字段最好背熟。type访问类型从好到差大概是system const eq_ref ref range index ALL。看到ALL就要立刻警觉这是全表扫描。const和eq_ref表示按主键或唯一索引精确匹配非常快range是范围扫描通常出现在、、between、in等条件里index表示扫了整棵索引树比扫全表好点但也不理想。key实际用到的索引如果为NULL就是没走索引需要回看条件为什么失效。rows优化器预估需要扫描的行数这个数越大越危险。Extra常见的有Using index覆盖索引好、Using filesort需要额外排序要警惕、Using temporary用到临时表通常伴随group by或distinct能避免就避免。一个很实用的技巧是面试时主动讲如何量化检查可以先在测试环境把SQL跑一遍、看scan行数和返回行数比例如果扫描行数远大于实际返回行数说明过滤性差。3.3 深分页、覆盖索引、前缀索引、count(*)的优化细节除了慢SQL排查下面几个优化点也是高频追问。深分页是业务里特别常见的坑。limit 100000, 20看着只取20条但数据库是把前100020条全扫出来再扔掉前10万条代价很大。两种常用优化一是改为基于上一页的最大id翻页where id 上一页最大id order by id desc limit 20这样每页都只扫20条二是用延迟关联先在本页需要的索引范围里查出主键再用主键去关联回原表取完整行。前缀索引适合很长的字符串列比如email。直接对email建索引索引会很大。可以取前N个字符建索引但要注意区分度。验证方法是select count(distinct left(email, 3)) / count(*)和select count(distinct left(email, 5)) / count(*)做对比选区分度可接受的最短前缀。**count(*)**也是经典送命题。InnoDB不像MyISAM那样单独维护一个总行数计数器所以count(*)是要扫描数据的表越大越慢。面试答题的加分点在于说清楚为什么不能简单缓存一个数字——因为事务隔离级别要求每个事务看到的数据总量可能不同业务上如果允许近似值可以用show table status里的rows精确计数可以用单独一张计数器表配合事务更新或者用Redis但要接受最终一致性。4. 并发控制与锁机制从行锁到死锁锁是并发面试的重灾区。很多人知道共享锁和排他锁但一问到间隙锁和死锁就开始含糊。这一节把锁的完整体系捋一遍。4.1 共享锁、排他锁与意向锁共享锁S锁和排他锁X锁是最基础的两种行级锁。S锁之间兼容多个事务可以同时给同一行加S锁S锁和X锁互斥X锁和X锁也互斥。用select ... lock in share mode加S锁用select ... for update或update/delete/insert加X锁。意向锁是容易忽略的表级锁。它的存在是为了快速判断表里有没有行锁。比如事务A给某一行加了X锁事务B想给整张表加X锁如果不查意向锁B就得一行行扫全表确认有没有行锁太慢了。所以A加行锁之前会先给表加一个意向锁IX或ISB看到表上有意向锁就知道表里有行被锁着直接等待。意向锁之间互相兼容它们只表示表里存在行级锁不限制其他事务加行锁。4.2 间隙锁和next-key lock幻读的解法与死锁来源InnoDB默认的RR隔离级别下普通的select走的是快照读有MVCC兜底但select ... for update、update、delete这种当前读必须真的把对应的记录锁住才不会被并发写破坏。为了防幻读InnoDB引入了间隙锁锁的是记录之间的间隙不是一个具体行。比如一个事务执行select * from order where id between 10 and 20 for update如果这个区间里只有id15这一行它会把这行锁住同时把10到15、15到20这两个间隙也锁住另一个事务想往间隙里插一条id12的记录会被阻塞幻读就没了。行锁和间隙锁合起来叫next-key lock它是一个左开右闭区间。这是幻读的解法同时也带来了麻烦——间隙锁之间可能互相冲突。事务A锁了某个间隙事务B也想锁同一个间隙两个可能同时持有兼容的间隙锁然后各自想插数据或锁行就会形成死锁。这也是为什么很多团队在生产环境把隔离级别调成RC因为RC只做行锁、不加间隙锁死锁概率会小很多代价是要接受可能出现幻读。4.3 死锁排查从日志到锁等待表的完整示例面试官如果问到线上死锁了你怎么排查你可以把下面这套链路说出来。第一步看死锁日志。执行SHOW ENGINE INNODB STATUS里面会有一段LATEST DETECTED DEADLOCK记录了谁是持有锁的一方、谁是等待锁的一方、以及涉及的事务SQL。第二步查当前锁等待情况SELECT * FROM information_schema.innodb_trx可以看所有正在运行的事务、锁了哪些行、已经跑了多久innodb_lock_waits能看到谁在等谁。第三步根据分析结果处理找到一个长时间不提交的事务kill掉它然后优化对应业务逻辑。我自己遇到过一个非常典型的死锁两个批量更新的任务一个按user_id升序更新一批用户另一个按user_id降序更新另一批用户当两个任务同时处理同一个用户集合时就出现了互相持有对方想要的锁。解法很朴素所有更新都按同一个顺序执行比如都按user_id升序死锁就自然消失了。这种固定加锁顺序的答案面试官听了会点头。5. 架构与集群主从复制、分库分表、数据一致性如果你的目标岗位是Java后端或者高级开发数据库架构题基本躲不开。这一章节看起来内容多其实核心就是三件事主从复制、分库分表、分布式事务。5.1 主从复制的原理与延迟问题一句话版主库把变更写入binlog从库拉取binlog写到本地的relay log再串行地把relay log里的SQL回放一遍。具体分三步主库提交事务时把变更记到binlog从库的IO线程连接到主库把binlog拉过来写到relay log从库的SQL线程读取relay log并回放让数据跟上主库。binlog有三种格式statement逻辑SQL、row记录行变更、mixed。现在生产环境基本都用row因为它更准确不会因为函数或上下文不同导致主从数据不一致代价是binlog体积会大一些。复制延迟是最常见的问题。原因很多从库只有一个SQL线程在串行回放遇到写入高峰就堆积大事务执行时间长DDL操作从库本身硬件不如主库。面试的加分回答是怎么缓解从库用并行复制把大事务拆成小批次不要在主库做重DDL关键读走主库从库允许短暂延迟再不行就换半同步复制保证至少一个从库收到binlog才提交。5.2 读写分离与连接池读写分离的本质是流量路由把select流量分到从库把update/delete/insert流量留在主库。实现上可以靠框架如ShardingSphere、中间件或客户端数据源路由。但读写分离有一个被问了无数次的坑主从延迟导致刚写入的数据马上读不到。业务处理方式一般是写后读强一致的场景直接读主库比如登录后立刻查自己的订单能接受延迟的场景才分发到从库。连接池也经常被当作隐藏考点。为什么一定要用连接池因为新建一个数据库连接要做TCP握手、认证、创建会话几十毫秒甚至上百毫秒对一个高频接口来说完全不可接受。连接池的作用就是保持一批连接复用需要时才从池里借。HikariCP这类连接池有几个关键参数maximumPoolSize最大连接数、minimumIdle最小空闲数、maxLifetime最大存活时间、connectionTimeout借连接的超时时间。配置不是越大越好一个简单估算思路是连接数≈QPS×单条SQL耗时峰值并发再留一些余量。如果连接数设置过大数据库端也会吃不消因为MySQL自己的max_connections是有限的。5.3 分库分表的拆分策略与分布式ID分库分表的核心动机是单表数据量太大、单库写入压力太高。拆法主要有垂直拆分和水平拆分。垂直拆分是把不同业务的表拆到不同库比如把用户表和订单表拆开水平拆分是把同一张表的数据按某个规则分布到多个库/多张表比如订单表按user_id分片。面试关键点是分片键怎么选。分片键一旦定下来查询模式基本就定死了。按user_id分片单个用户的订单都落在一张表里查自己的订单很快但如果业务要按商家批量查订单就麻烦了得在所有分片里各查一遍也就是广播查询。所以分片键要选最核心的查询维度不能又想按用户查、又想按商家查那不是单键分片能解决的问题通常需要再引入一个映射表或通过数据同步建副本。分库分表之后分布式ID是绕不开的。数据库自增主键在分片下会重复UUID勉强可以但太长、且无序作为InnoDB主键会导致页分裂严重。业界最常用的是雪花算法一个64位的ID通常包含1位符号位、41位时间戳、10位机器ID、12位序列号趋势递增、全局唯一、无需中心化协调。回答时可以提到它的时钟回拨问题这是加分项。还有一种是数据库号段模式用一个单独的表记录号段应用每次取一批ID用完再取实现简单适合中小规模。5.4 分布式事务两阶段提交、TCC、最终一致性问到分布式事务先别急着背方案要先说清楚需求分级。如果业务对一致性要求极高比如转账通常用强一致的方案如果电商下单这种场景库存扣了、订单生成了但积分晚一点加大家都能接受那就是最终一致。强一致方案最经典的是两阶段提交2PC。第一阶段prepare所有参与者把操作准备好并锁住资源第二阶段commit协调者确认所有人都准备好了再统一提交。问题在于第二阶段如果协调者挂了或网络超时参与者只能一直阻塞可用性差。TCC是补偿思想。把一个操作拆成Try、Confirm、Cancel三个阶段Try阶段预留资源Confirm阶段真正执行Cancel阶段回滚。比如扣减账户余额Try是冻结资金Confirm是扣走Cancel是解冻。它的好处是业务控制力强坏处是实现非常复杂每个业务都要写三套逻辑。更务实的方案是本地消息表或基于MQ的最终一致。核心思路本地业务操作和写消息表在同一个事务里完成然后异步把消息发给MQ下游消费消息执行后续操作。这样上游不会因为下游失败而回滚整个业务靠不断重试幂等最终到达一致。面试时能回答到这个层面基本就说明你是真的设计过数据一致性不是单纯背概念。6. 数据库生态扩展题缓存、中间件与新型数据库现在数据库面试早就不只问MySQL了Redis、连接池、甚至时序数据库和向量数据库都可能出现。这类题考的是选型思维和工程判断不需要很深但要有自己的逻辑。6.1 Redis与数据库的缓存一致性问题缓存一致性是面试常青树。最常问的问题是先更新数据库还是先更新缓存直接说结论不要先更新缓存因为并发下容易出现脏数据。成熟的方案是Cache Aside模式读的时候先读缓存没有就查库再回填写的时候先更新数据库再删除缓存。为什么是删除缓存而不是更新缓存因为更新这个动作在并发场景下容易引入中间态比如两个请求交错写缓存里可能留下旧值而删除缓存等于强制让下次读去数据库拿最新值更安全。但先更新库再删缓存也有极端情况更新库成功、删缓存失败缓存里就是旧数据。实战中常用延迟双删先删缓存、更新库、过几百毫秒再删一次或者订阅binlog在数据库变更后异步删除对应缓存。同时还要考虑缓存击穿、穿透、雪崩穿透用布隆过滤器挡掉不存在的key击穿可以用互斥锁只放一个线程回源雪崩的做法是过期时间加随机值或做多级缓存。这些都是高频延伸值得提前串一遍。6.2 连接池参数与常见的丢连接问题连接池不止是配几个参数这么简单。线上经常出现一种现象应用日志一堆Connection is not available, request timed out但数据库的max_connections还没打满。这种多半不是数据库本身的问题而是连接池用完了。常见原因有两种。一种是连接泄漏代码里拿了连接不归还排查的方法是SHOW PROCESSLIST看是不是有一堆Sleep时间特别长的连接然后去代码里找没finally释放的地方。另一种是慢SQL把连接占住了一批慢查询每个执行好几秒如果平均执行时间变长连接池的周转率下降其他请求就只能排队等连接。解决思路是反方向先优化慢SQL而不是无脑调大maximumPoolSize。我也见过很多人一遇到连接池满了就上调参数结果数据库端连接数升上去、CPU被打满问题反而更严重。面试时能说出这个取舍说明你处理过真实故障。6.3 新型数据库与时序/向量数据库的常识这两年面试还会出现什么时候不用MySQL这类开放题这是在考察你对数据库生态的认知边界。比如物联网场景大量设备上报指标数据每分钟几百万条写入MySQL的B树在这种高并发写入下很容易成为瓶颈。时序数据库比如TDengine针对这类场景做了很多优化写入采用追加模式存储上用列式压缩还提供自动降采样和预聚合查历史聚合指标时性能远甩关系型数据库。向量数据库则是随着AI应用火起来的核心解决语义相似度检索问题。比如把文档切块后通过embedding模型转成语义向量存进向量数据库查询时用HNSW这类近似最近邻索引快速找到最相似的向量。它跟普通数据库的重量级事务能力关系不大拼的是海量高维向量的检索速度。面试里不需要你深研算法但能说清楚MySQL的B树和like做不了语义相关排序所以才有专用数据库就够了。7. 场景题复盘库存扣减、排行榜怎么答出深度最后一类高频题是场景设计题它的特点是考的不是单一知识点而是你如何把索引、锁、事务、缓存综合起来解决一个具体问题。这里拿两个最经典的题演示一遍答题思路。7.1 库存扣减超卖问题如何解秒杀场景的库存扣减最常见的错误答案是先select查库存判断大于0再update减库存。这是典型的并发超卖写法两个请求同时查到库存为1都判断成功都执行update库存就变成负数。正确的做法是把判断和扣减合并到一条SQL里update stock set count count - 1 where id ? and count 0。这条SQL在数据库层面是行锁原子的天然不会超卖不用显式加事务锁。进一步追问如果并发极高数据库扛不住怎么办面试官想听的是分层方案。可以在Redis里预扣库存用DECR命令判断是否大于等于0挡掉大部分无效请求真正扣减成功的人再异步落到数据库生成订单最后用消息队列削峰数据库只处理最终落库量。这里还有一个加分点无论用哪种方案都要保证幂等每个用户同一秒杀活动只能下一个单否则重复扣减会出现负库存需要引入用户活动的唯一约束或去重表。7.2 排行榜数据库order by为什么不够用排行榜也是高频场景题。最简单粗暴的做法是把所有用户分数存储在MySQL表里每次查排行榜用order by score desc limit 100。这个方案在用户量小的时候没问题但用户量到了百万级、读写并发一上来全表排序的代价就很大而且排行榜的写是高频加分的每次都触发行锁竞争数据库会成为瓶颈。如果排行榜的排序要求分数从高到低、分数相同按时间从早到晚Redis的ZSet是常规解法。ZSet的score是一个浮点数可以把分数时间编码成一个组合值。一个常用技巧是排序分 分数 * 10^N (基准时间戳 - 用户的时间戳)这样ZSet会先按分数排同分时时间更早的值更大、排在前面。取排行榜用ZREVRANGE带上WITHSCORES就行。面试再加分的方式是讲清楚为什么不同时用两个字段排序——因为ZSet只支持一个score必须编码成一个数。7.3 开放题答题框架先说方案、再说权衡、最后说边界如果你没有实际做过秒杀和排行榜这类系统也没关系场景题更看重的其实是你的思考框架。我自己的答题套路是三步先明确约束再说方案最后说边界。第一如果面试官没说清楚数据量和一致性要求一定要主动问这个系统大概多大量级几万QPS还是几千QPS能否接受短期不一致约束不同方案完全不同。第二给出一个你最有把握的方案并解释为什么这样设计比如我选这个方案是因为它的写入吞吐更高代价是故障恢复比较复杂。第三主动说这个方案在什么情况下会失效比如如果某个分片的热点特别集中这个方案会退化成单库压力需要再加一层热点key拆分。能走完这三步哪怕你最终方案不是最优面试官也会认可你的工程判断力。我的个人建议是准备数据库面试题与其把时间花在刷几百道零散题不如把上面几条主线画成一张思维导图每个知识点都自问一遍这个为什么成立、它解决了什么问题、它有什么代价。面试官真正想招的不是题库机器而是出了问题能判断方向、能解释清楚原因的人。最后分享一个我复习时一直在用的小方法对每个考点写一句给新手解释的话和一句给专家解释的话。能写出后者这个知识点你就是真的掌握了比背任何答案都稳。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑