标签题目
数据库相关面试题
MySQL B+ 树索引的实现
这题考察 InnoDB 如何用页式 B+ 树降低磁盘 I/O,并把等值查询、范围扫描、聚簇索引、二级索引和回表串成一条完整链路。
同题还出现在 2 个公司岗位
缓存和数据库怎么保持数据一致性?还有别的做法吗?
这题考察 Cache Aside 的读写路径、并发竞态、删除失败补偿和一致性取舍,重点不是追求绝对一致,而是控制旧数据窗口。
同题还出现在 2 个公司岗位
数据库事务是什么,ACID 分别代表什么?
这题考察事务边界、ACID 语义、日志恢复、隔离级别和业务不变量,重点是把概念落到数据库执行机制。
MySQL 支持哪些隔离级别,对应实现原理是什么?
考察 MySQL InnoDB 隔离级别、MVCC、ReadView、undo log 和锁机制,重点是快照读与当前读的实现差异。
聚簇索引和非聚簇索引有什么区别?
聚簇索引和非聚簇索引的核心区别在于索引叶子节点是否直接保存完整数据行。聚簇索引决定数据行的组织方式,非聚簇索引是额外的查找结构,通常还需要再定位到真实数据。
数据库索引为什么能加速查询?
数据库索引能加速查询,是因为它用有序的数据结构把全表扫描变成定向查找,减少需要读取、比较和回表的数据量,并且可以利用有序性优化范围查询、排序和覆盖查询。
MVCC 的实现原理是什么?
MVCC 是多版本并发控制,通过为数据保留多个历史版本,让读操作基于一致性快照判断可见版本,从而减少读写互相阻塞。常见实现依赖隐藏版本字段、undo log、ReadView 和可见性规则。
MySQL 索引失效有哪些常见场景?
MySQL 索引失效通常不是索引真的损坏,而是查询写法、类型转换、联合索引顺序、模糊匹配、否定条件或优化器成本判断导致索引无法高效使用,甚至被执行计划放弃。
MySQL 查询为什么可能不走索引?
MySQL 不走索引通常不是“索引失效”这么简单,而是优化器认为使用索引的总代价不划算,或者查询条件的写法让索引无法被有效利用。面试中要从索引可用性、选择性、代价模型、联合索引规则和执行计划验证几层回答。
MySQL 如何防止幻读?
MySQL 防止幻读要分清快照读和当前读。InnoDB 在可重复读下通过 MVCC 让普通查询看到稳定快照,通过 next-key lock 和 gap lock 保护范围加锁查询,从而阻止其他事务在范围内插入新记录。
MySQL 最左前缀原则是什么?
最左前缀原则是联合索引按定义顺序从左到右建立有序结构,查询只有从最左列开始连续使用索引列,才能充分利用联合索引。它影响 where 条件、范围查询、排序、分组和覆盖索引设计。
数据库中乐观锁和悲观锁的应用场景是什么?
乐观锁适合读多写少、冲突概率低、业务能接受失败重试的场景;悲观锁适合写冲突高、强一致要求高、不能接受并发覆盖或超卖的场景。回答要围绕版本号/CAS、update where version、重试策略、select for update、行锁、事务边界、死锁风险、隔离级别和幂等性展开。
图数据库是否对 BFS、DFS、找节点之间最短路等有支持?
图数据库通常会直接或间接支持 BFS、DFS、节点间最短路等图遍历能力,支持形式既包括查询语言中的可变长度路径匹配,也包括数据库内置过程、图算法库和离线图计算框架。回答要区分在线图查询和大规模图算法计算,并讲清邻接存储、索引、复杂度、事务一致性以及和关系型数据库递归 join 的差异。
非聚簇索引二次查找的过程?
非聚簇索引二次查找,本质是 InnoDB 使用二级索引先定位满足条件的索引记录,再通过索引叶子节点里保存的主键值到聚簇索引中查找完整行记录。这个过程常被称为回表。面试回答要说明二级索引和聚簇索引的结构差异、为什么叶子节点存主键而不是整行、什么时候必须回表、覆盖索引如何避免回表,以及 ICP、联合索引、范围扫描和优化器成本估算对实际执行路径的影响。
索引都用在什么情况下?
索引适合用在能够显著减少扫描行数、避免额外排序、加速表连接、减少回表或保障数据唯一性的场景,但它不是越多越好。回答要同时讲清楚收益与代价:索引能提升读查询效率,也会占用空间、增加写入维护成本,并且低选择性字段、小表、频繁更新字段往往不适合盲目建索引。
Redis是否支持事务?
Redis 支持事务,但它的事务更像“命令批量排队并按顺序一次性执行”的机制,而不是关系型数据库里带自动回滚、强一致约束检查的事务。面试回答要强调 MULTI、EXEC、DISCARD、WATCH 的作用,以及入队错误和执行期错误的处理差异。
说一下数据库底层数据结构B+数据,为什么用,与二叉平衡树区别 Redis怎么用的?
数据库索引常用 B+ 树,核心原因不是“查找复杂度看起来是 O(log n)”,而是它非常适合磁盘和页式存储:节点扇出高,树高低,单次查询需要的页访问次数少;叶子节点按键有序并通过链表连接,范围查询、排序扫描、分页扫描都很高效。二叉平衡树如 AVL、红黑树更适合内存中的动态查找结构,节点扇出低、树高大、局部性差,如果直接用于磁盘索引会产生大量随机 I/O。
MySQL 底层数据结构?
MySQL 底层数据结构在 InnoDB 中主要围绕“页、B+树索引、聚簇索引、二级索引、Buffer Pool、事务日志”展开。真正决定查询性能的不是某一个抽象结构,而是这些结构如何协同:数据按页组织,索引以 B+树维护有序访问路径,主键索引叶子节点保存完整行记录,二级索引叶子节点保存主键值,内存中的 Buffer Pool 缓存热点页,变更再通过 redo log、undo log 等机制保证事务与崩溃恢复。理解这些内容,才能解释为什么 MySQL 不直接使用普通二叉树、红黑树或单纯哈希表作为主要索引结构。
mysql慢查询优化方案?
这道题考察的不是背几个索引原则,而是候选人能否把“发现慢查询、判断瓶颈、制定优化方案、验证效果、防止回退”串成闭环。优秀回答应覆盖慢查询日志与监控定位、EXPLAIN 执行计划分析、索引设计、SQL 改写、表结构与数据规模治理、分页与排序优化、锁等待排查、缓存与业务链路优化,以及上线后的持续观测。
内存资源很宝贵,为什么不能直接访问数据库表?
不能直接访问数据库表的原因是,表不是应用进程里可随意读取的一块内存数组,而是数据库引擎管理的持久化数据结构。应用需要通过 SQL、连接、权限、索引、事务和数据库协议访问数据;数据库内部再决定从磁盘、Buffer Pool、索引页或缓存中读取哪些页。绕过数据库引擎或把全表搬到内存,会破坏一致性、并发控制、恢复能力、安全边界和资源隔离。
InnoDB 和 MyISAM 区别?
InnoDB 和 MyISAM 的核心区别不是简单的谁快谁慢,而是存储引擎目标不同。InnoDB 面向事务一致性、崩溃恢复和高并发 OLTP,支持事务、行级锁、MVCC、外键、聚簇索引和可靠恢复;MyISAM 是早期非事务引擎,主要使用表级锁,不支持事务和外键,恢复能力弱,适合范围非常有限。
后端通过什么连接到数据库?
后端连接数据库的核心链路通常是:业务代码通过 ORM 或数据访问框架发起数据库操作,框架从连接池拿到连接,连接池底层使用数据库驱动,驱动按照数据库协议与数据库实例、代理或中间件建立 TCP 连接,并完成认证、参数协商、SQL 发送、结果解析、事务控制和连接复用。以 Java 后端连接 MySQL 为例,常见链路是 Service/DAO -> MyBatis/JPA/JdbcTemplate -> DataSource/HikariCP/Druid -> JDBC Driver/MySQL Connector/J -> MySQL 协议 -> MySQL Server 或数据库代理。
MySQL事务的四种特性,分别解释?
MySQL 事务的四种特性是 ACID:原子性、一致性、隔离性、持久性。在 InnoDB 中,原子性主要依赖 undo log 回滚;隔离性依赖 MVCC、ReadView 和锁;持久性主要依赖 redo log 及刷盘机制;一致性不是某一个日志单独保证的,而是由数据库约束、事务语义、隔离控制、崩溃恢复和应用正确性共同保证。
索引下推是什么?
索引下推(Index Condition Pushdown,ICP)是 MySQL 优化器把部分原本由 server 层判断的 WHERE 条件,下推到存储引擎层,在扫描二级索引时先利用索引记录中的列做过滤,再决定是否回表读取完整行。它的核心价值不是减少索引扫描本身,而是减少无效回表次数,尤其适合联合索引中部分条件不能继续用于定位范围、但仍包含在索引列里的场景。
Spring 事务失效有哪些常见场景?
Spring 事务失效不要只背 @Transactional 场景清单,核心要答出声明式事务的运行条件:方法调用必须进入 Spring AOP 代理,由 TransactionInterceptor 配合 TransactionManager 在调用前后开启、提交或回滚事务;常见失效本质上分为三类:没有经过代理、异常没有触发回滚、真实数据库资源没有加入同一个事务。
MySQL 事务隔离级别有哪些?
这题考察对 SQL 标准隔离级别和 MySQL InnoDB 实现差异的理解。面试中不能只背四个名字,还要说明每个级别解决哪些并发读问题、MySQL 默认为什么是可重复读,以及 InnoDB 通过 MVCC、快照读、当前读和 next-key lock 在不同读场景下处理一致性与幻读的边界。
分库分表如何设计?
分库分表不是先选中间件,而是先判断单库单表在容量、吞吐、可用性、隔离性上的瓶颈,再设计一套可路由、可扩容、可治理、可回滚的数据架构。好的回答要把垂直拆分、水平拆分、分片键、路由、全局 ID、事务、查询、扩容、热点、读写分离和灰度治理串成一个完整工程方案。
B 树和 B+ 树有什么区别?
B 树和 B+ 树都是面向磁盘页设计的多路平衡搜索树,核心差异不只是数据放在哪里,而是由此带来的扇出、树高、查询路径稳定性、范围扫描能力和索引工程实现差异。数据库索引更偏好 B+ 树,因为它能用更高扇出降低磁盘访问次数,并用叶子节点顺序结构支撑范围查询、排序、覆盖索引和顺序预读。
如何定位慢sql,怎么优化?
定位慢 SQL 的核心不是只看执行时间,而是建立从发现、归因、验证到优化的闭环:先通过监控、慢查询日志、数据库性能视图确认慢 SQL;再结合执行计划、索引、扫描行数、锁等待、事务、数据量和业务访问模式判断瓶颈;最后用索引、SQL 改写、分页优化、表结构调整、缓存或架构拆分降低扫描量、排序量、回表量和锁竞争。
ORACLE中的SQL如何进行优化,都有哪些方式?
Oracle SQL 优化不是单纯加索引,而是先定位慢在哪里,再用执行计划、统计信息、访问路径、连接方式、SQL 改写和运行期指标形成闭环。面试中应强调以真实执行计划为依据,以业务过滤条件和数据分布为基础,以响应时间、逻辑读、物理读、CPU、等待事件等指标证明优化效果。
SQL 分析题应该如何拆解指标口径和查询逻辑?
回答这类问题不能只说加索引或看执行计划。高质量拆解应先把查询要回答的业务问题讲清楚:指标是什么、统计哪段数据、以什么粒度统计、哪些记录应被纳入或排除;再把 SQL 的逻辑链路拆成数据源、JOIN 关系、过滤条件、聚合口径、排序分页;最后进入性能定位,从慢查询日志、执行计划、索引命中、扫描行数、临时表、排序、锁等待和数据倾斜等角度判断慢在哪里。核心思路是先证明结果口径正确,再证明执行路径高效。
nosql和关系型数据库的区别?
NoSQL 和关系型数据库的核心区别不是新旧,也不是是否支持事务,而是数据模型、结构约束、查询能力、扩展路径和一致性取舍不同。关系型数据库以关系模型、固定 schema、SQL、事务和复杂查询见长,适合结构稳定、关联清晰、强一致要求高的业务;NoSQL 包括 key-value、document、column-family、graph 等类型,更强调灵活 schema、水平扩展、高吞吐和面向访问模式的数据建模。大型系统中二者经常组合使用,而不是互相替代。
设计朋友圈功能时,数据库表如何从简单到复杂演进?
朋友圈数据库设计可以按复杂度分层回答:最小可用版本先有用户、好友关系、动态、媒体、评论和点赞;进阶版本补可见范围、权限校验和删除模型;高并发版本再讨论时间线、读扩散与写扩散、冷热数据、索引、分库分表、幂等与一致性。面试时不要一上来就堆表,而是先说明业务读写路径:发动态、刷列表、看详情、评论点赞、删除和权限变化。
后端慢 SQL 会如何影响前端体验?
后端慢 SQL 不只是后端问题,它会沿着请求链路放大为前端可感知的卡顿、白屏、加载时间过长、按钮无响应、接口超时、重复提交和数据不一致。核心机制是数据库读写占用锁、CPU、IO 和连接,进一步拖慢应用线程、连接池、网关队列与浏览器请求队列,最终影响页面渲染、交互反馈和业务流程完成率。
什么是缓存穿透?
什么是缓存穿透?这道腾讯牛客题的关键是围绕“缓存穿透”讲清概念、机制、取舍和边界。缓存穿透指请求查询一个缓存和数据库都不存在的 key,缓存无法命中,每次都会打到数据库。恶意构造不存在参数或大量长尾不存在 key 时,会造成回源 QPS 异常升高。
锁的种类、悲观锁和乐观锁的区别?
锁的种类、悲观锁和乐观锁的区别?这道腾讯牛客题的关键是围绕“悲观锁、乐观锁与锁类型选择”讲清概念、机制、取舍和边界。悲观锁和乐观锁不是具体 API 名称,而是并发控制思路。悲观锁假设冲突常发生,访问共享资源前先加锁,典型表现是互斥锁、数据库行锁;乐观锁假设冲突较少,先无锁读取和计算,提交时用版本号、CAS 或时间戳检测冲突。
缓存与数据库如何保证一致性?
缓存与数据库如何保证一致性?这道腾讯牛客题的关键是围绕“缓存与数据库一致性”讲清概念、机制、取舍和边界。缓存和数据库通常很难做到强一致,工程上多采用 Cache Aside 并接受短暂最终一致。常见写法是先更新数据库,提交成功后删除缓存;删除失败要有重试、消息补偿或 binlog/CDC 修正。
redis与mysql如何保持一致的?
redis与mysql如何保持一致的?这道腾讯牛客题的关键是围绕“缓存与数据库一致性”讲清概念、机制、取舍和边界。缓存和数据库通常很难做到强一致,工程上多采用 Cache Aside 并接受短暂最终一致。常见写法是先更新数据库,提交成功后删除缓存;删除失败要有重试、消息补偿或 binlog/CDC 修正。
redis缓存击穿、穿透、雪崩及其解决方法?
redis缓存击穿、穿透、雪崩及其解决方法?这道腾讯牛客题的关键是围绕“缓存异常流量防护”讲清概念、机制、取舍和边界。缓存穿透、击穿和雪崩都是缓存层保护后端数据源时常见的异常流量问题。穿透是请求的数据本身不存在导致反复打到后端;击穿是热点 key 过期瞬间大量请求回源;雪崩是大量 key 同时失效或缓存集群不可用导致整体回源压力暴涨。
mysql索引类型有哪些?
mysql索引类型有哪些?这道腾讯牛客题的关键是围绕“MySQL 索引类型”讲清概念、机制、取舍和边界。MySQL 常见索引类型可按用途分为主键索引、唯一索引、普通索引、联合索引、前缀索引、全文索引和空间索引;在 InnoDB 中还要区分聚簇索引和二级索引。
mysql中的数据类型有哪些?
mysql中的数据类型有哪些?这道腾讯牛客题的关键是围绕“MySQL 数据类型选择”讲清概念、机制、取舍和边界。MySQL 数据类型可以按数值、字符串、日期时间、JSON/空间等类别回答。高质量答案不只是列类型名,还要说明存储范围、精度、排序比较、索引长度、隐式转换和业务语义。
数据库索引为什么快?
数据库索引为什么快?这道腾讯牛客题的关键是围绕“数据库索引为什么快”讲清概念、机制、取舍和边界。数据库索引快的核心是减少扫描行数和磁盘页访问。以 InnoDB B+ 树为例,高扇出让树高很低,等值查询只需从根页定位到叶子页;叶子页有序且链表相连,范围查询可以顺序扫描。
Mysql索引,怎样防止回表查询?
Mysql索引,怎样防止回表查询?这道腾讯牛客题的关键是围绕“MySQL 二级索引回表与覆盖索引”讲清概念、机制、取舍和边界。防止回表的核心是让查询所需字段都能从同一个二级索引中取到,也就是覆盖索引。InnoDB 二级索引叶子节点保存索引列和主键值,如果 SELECT 或过滤条件还需要非索引列,就要按主键回到聚簇索引读取完整行。
当遇到大批量数据查询时,怎么优化数据库,提高查询效率?
当遇到大批量数据查询时,怎么优化数据库,提高查询效率?这道腾讯牛客题的关键是围绕“大批量数据库查询优化”讲清概念、机制、取舍和边界。大批量数据查询优化要先定位慢 SQL 和执行计划,再从索引、分页方式、批处理、字段裁剪、流式读取、冷热数据和读写分离等方向降低扫描、排序和传输成本。
如果数据库是分布式的,如何保证数据一致性呢?
如果数据库是分布式的,如何保证数据一致性呢?这道腾讯牛客题的关键是围绕“分布式数据库一致性”讲清概念、机制、取舍和边界。分布式数据库一致性要先说明一致性目标:强一致、读己之写、单调读或最终一致。常用机制包括 Raft/Paxos 共识、quorum 读写、主从复制、2PC/TCC/Saga、幂等重试、版本冲突解决和异步对账补偿。
Mysql可串行化怎么实现的?
Mysql可串行化怎么实现的?这道腾讯牛客题的关键是围绕“MySQL Serializable 实现”讲清概念、机制、取舍和边界。MySQL InnoDB 的 Serializable 目标是让并发事务结果等价于串行执行。它会让普通读更倾向于加锁读,通过共享锁、next-key lock 和范围锁阻止其他事务插入或修改会影响当前读结果的数据。
分布式数据库怎么保证一致性?
分布式数据库怎么保证一致性?这道腾讯牛客题的关键是围绕“分布式数据库一致性”讲清概念、机制、取舍和边界。分布式数据库一致性要先说明一致性目标:强一致、读己之写、单调读或最终一致。常用机制包括 Raft/Paxos 共识、quorum 读写、主从复制、2PC/TCC/Saga、幂等重试、版本冲突解决和异步对账补偿。
Mysql两种引擎知道吗,他们的索引有什么区别?
Mysql两种引擎知道吗,他们的索引有什么区别?这道腾讯牛客题的关键是围绕“InnoDB 与 MyISAM 索引区别”讲清概念、机制、取舍和边界。这题通常重点比较 InnoDB 和 MyISAM。InnoDB 使用聚簇索引组织数据,主键索引叶子保存完整行,二级索引叶子保存主键值;MyISAM 数据文件和索引文件分离,索引叶子通常保存数据文件地址。