知识点标签

数据库面试题解析

数据库基础相关面试题,覆盖索引、事务、缓存协同和一致性。

69 道题 8 个岗位 9 个公司

数据库相关面试题

图数据库是否对 BFS、DFS、找节点之间最短路等有支持?

图数据库通常会直接或间接支持 BFS、DFS、节点间最短路等图遍历能力,支持形式既包括查询语言中的可变长度路径匹配,也包括数据库内置过程、图算法库和离线图计算框架。回答要区分在线图查询和大规模图算法计算,并讲清邻接存储、索引、复杂度、事务一致性以及和关系型数据库递归 join 的差异。

非聚簇索引二次查找的过程?

非聚簇索引二次查找,本质是 InnoDB 使用二级索引先定位满足条件的索引记录,再通过索引叶子节点里保存的主键值到聚簇索引中查找完整行记录。这个过程常被称为回表。面试回答要说明二级索引和聚簇索引的结构差异、为什么叶子节点存主键而不是整行、什么时候必须回表、覆盖索引如何避免回表,以及 ICP、联合索引、范围扫描和优化器成本估算对实际执行路径的影响。

索引都用在什么情况下?

索引适合用在能够显著减少扫描行数、避免额外排序、加速表连接、减少回表或保障数据唯一性的场景,但它不是越多越好。回答要同时讲清楚收益与代价:索引能提升读查询效率,也会占用空间、增加写入维护成本,并且低选择性字段、小表、频繁更新字段往往不适合盲目建索引。

说一下数据库底层数据结构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、索引页或缓存中读取哪些页。绕过数据库引擎或把全表搬到内存,会破坏一致性、并发控制、恢复能力、安全边界和资源隔离。

后端通过什么连接到数据库?

后端连接数据库的核心链路通常是:业务代码通过 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 在调用前后开启、提交或回滚事务;常见失效本质上分为三类:没有经过代理、异常没有触发回滚、真实数据库资源没有加入同一个事务。

分库分表如何设计?

分库分表不是先选中间件,而是先判断单库单表在容量、吞吐、可用性、隔离性上的瓶颈,再设计一套可路由、可扩容、可治理、可回滚的数据架构。好的回答要把垂直拆分、水平拆分、分片键、路由、全局 ID、事务、查询、扩容、热点、读写分离和灰度治理串成一个完整工程方案。

B 树和 B+ 树有什么区别?

B 树和 B+ 树都是面向磁盘页设计的多路平衡搜索树,核心差异不只是数据放在哪里,而是由此带来的扇出、树高、查询路径稳定性、范围扫描能力和索引工程实现差异。数据库索引更偏好 B+ 树,因为它能用更高扇出降低磁盘访问次数,并用叶子节点顺序结构支撑范围查询、排序、覆盖索引和顺序预读。

如何定位慢sql,怎么优化?

定位慢 SQL 的核心不是只看执行时间,而是建立从发现、归因、验证到优化的闭环:先通过监控、慢查询日志、数据库性能视图确认慢 SQL;再结合执行计划、索引、扫描行数、锁等待、事务、数据量和业务访问模式判断瓶颈;最后用索引、SQL 改写、分页优化、表结构调整、缓存或架构拆分降低扫描量、排序量、回表量和锁竞争。

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、幂等重试、版本冲突解决和异步对账补偿。

分布式数据库怎么保证一致性?

分布式数据库怎么保证一致性?这道腾讯牛客题的关键是围绕“分布式数据库一致性”讲清概念、机制、取舍和边界。分布式数据库一致性要先说明一致性目标:强一致、读己之写、单调读或最终一致。常用机制包括 Raft/Paxos 共识、quorum 读写、主从复制、2PC/TCC/Saga、幂等重试、版本冲突解决和异步对账补偿。

Mysql两种引擎知道吗,他们的索引有什么区别?

Mysql两种引擎知道吗,他们的索引有什么区别?这道腾讯牛客题的关键是围绕“InnoDB 与 MyISAM 索引区别”讲清概念、机制、取舍和边界。这题通常重点比较 InnoDB 和 MyISAM。InnoDB 使用聚簇索引组织数据,主键索引叶子保存完整行,二级索引叶子保存主键值;MyISAM 数据文件和索引文件分离,索引叶子通常保存数据文件地址。