标签题目
MySQL相关面试题
MySQL B+ 树索引的实现
这题考察 InnoDB 如何用页式 B+ 树降低磁盘 I/O,并把等值查询、范围扫描、聚簇索引、二级索引和回表串成一条完整链路。
同题还出现在 2 个公司岗位
MySQL 支持哪些隔离级别,对应实现原理是什么?
考察 MySQL InnoDB 隔离级别、MVCC、ReadView、undo log 和锁机制,重点是快照读与当前读的实现差异。
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、事务、查询、扩容、热点、读写分离和灰度治理串成一个完整工程方案。
如何定位慢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、水平扩展、高吞吐和面向访问模式的数据建模。大型系统中二者经常组合使用,而不是互相替代。
设计朋友圈功能时,数据库表如何从简单到复杂演进?
朋友圈数据库设计可以按复杂度分层回答:最小可用版本先有用户、好友关系、动态、媒体、评论和点赞;进阶版本补可见范围、权限校验和删除模型;高并发版本再讨论时间线、读扩散与写扩散、冷热数据、索引、分库分表、幂等与一致性。面试时不要一上来就堆表,而是先说明业务读写路径:发动态、刷列表、看详情、评论点赞、删除和权限变化。
Mysql可串行化怎么实现的?
Mysql可串行化怎么实现的?这道腾讯牛客题的关键是围绕“MySQL Serializable 实现”讲清概念、机制、取舍和边界。MySQL InnoDB 的 Serializable 目标是让并发事务结果等价于串行执行。它会让普通读更倾向于加锁读,通过共享锁、next-key lock 和范围锁阻止其他事务插入或修改会影响当前读结果的数据。
Mysql两种引擎知道吗,他们的索引有什么区别?
Mysql两种引擎知道吗,他们的索引有什么区别?这道腾讯牛客题的关键是围绕“InnoDB 与 MyISAM 索引区别”讲清概念、机制、取舍和边界。这题通常重点比较 InnoDB 和 MyISAM。InnoDB 使用聚簇索引组织数据,主键索引叶子保存完整行,二级索引叶子保存主键值;MyISAM 数据文件和索引文件分离,索引叶子通常保存数据文件地址。
数据库索引的作用?
数据库索引的作用?这道腾讯牛客题的关键是围绕“数据库索引的作用”讲清概念、机制、取舍和边界。数据库索引的作用是为查询提供更高效的访问路径,减少全表扫描。它可以加速等值查询、范围查询、排序、分组和连接条件,在覆盖索引场景下还能减少回表。
数据库性能优化通常从哪些方向入手?
数据库性能优化通常从哪些方向入手?这道腾讯牛客题的关键是围绕“数据库性能优化方向”讲清概念、机制、取舍和边界。数据库性能优化要从定位、SQL/索引、表结构、事务锁、连接池、缓存、架构扩展和硬件参数多层看。先用慢查询日志、监控和执行计划定位瓶颈,再决定是改 SQL、加索引、拆表、调连接池还是做缓存/读写分离。
什么是数据库事务?事务的 ACID 特性是什么?
什么是数据库事务?事务的 ACID 特性是什么?这道腾讯牛客题的关键是围绕“数据库事务与 ACID”讲清概念、机制、取舍和边界。事务是一组数据库操作的逻辑单元,要么全部成功提交,要么失败回滚。ACID 分别是 Atomicity 原子性、Consistency 一致性、Isolation 隔离性和 Durability 持久性。
MySQL 常见存储引擎有哪些?它们有什么区别?
MySQL 常见存储引擎有哪些?它们有什么区别?这道腾讯牛客题的关键是围绕“MySQL 存储引擎差异”讲清概念、机制、取舍和边界。MySQL 常见存储引擎包括 InnoDB、MyISAM、Memory、Archive 和 CSV。当前默认主流是 InnoDB,支持事务、行级锁、MVCC、外键和崩溃恢复;MyISAM 不支持事务,主要是表级锁。
SQL 语句执行效率低时,如何分析并优化?
SQL 语句执行效率低时,如何分析并优化?这道腾讯牛客题的关键是围绕“SQL 查询优化与索引失效判断”讲清概念、机制、取舍和边界。SQL 慢或大批量查询要按定位、解释、改写、验证的流程处理:先从慢查询日志定位 SQL,再用 EXPLAIN/EXPLAIN ANALYZE 看访问类型、索引、扫描行数、回表、排序和临时表。