MySQL 面试题:索引、事务与排查
把 SQL、执行计划和事务现象连起来,形成可验证的数据库解题过程。
适用范围
MySQL / InnoDB;参考手册版本为 MySQL 8.4,实操请先核对服务器版本。
MySQL 面试准备应围绕两条主线展开:查询怎样找到数据,事务怎样在并发下保持业务约束。索引结构、执行计划、锁和隔离级别需要放进同一个具体场景,才能解释性能与正确性的取舍。
学习顺序
- SQL 执行路径。 从连接、解析、优化到存储引擎,区分查询语义与执行方式。
- 索引设计。 选一个有筛选、排序和分页的查询,说明联合索引的列顺序,以及增加索引带来的写入成本。
- 事务现象。 在两个数据库连接中复现更新与读取,记录隔离级别、执行顺序和观察结果。
- 定位慢查询。 先确认耗时与扫描规模,再检查执行计划、数据分布和锁等待。不要看到慢 SQL 就直接增加索引。
工程练习:订单列表
设想查询某个用户最近一个月的订单,按创建时间倒序展示。写下 WHERE、ORDER BY 和 LIMIT,再设计候选索引。在测试库中改变用户订单数量,比较计划与延迟。对于写入频繁的表,同时记录插入和更新的成本。
容易混淆的边界
事务的原子性不意味着任意业务流程天然正确。应用中的先读后写、重复请求、跨系统调用仍需要明确约束。隔离级别的名称也不能代替具体 SQL 与访问路径分析。
完成后,应能解释“为什么选这个索引”“它在哪些查询上无效”“如何用实验验证”。
参考资料
相关学习路线
- Java 面试题与基础复习路线
- Redis 面试题:数据结构与缓存场景
- JVM 面试题:内存、GC 与故障排查
- Java 并发面试题:锁、线程池与可见性
- 计算机网络面试题:TCP、HTTP 与请求链路
安排复习节奏
MySQL题库
共 81 道题按题库默认顺序排列,可选择分类集中练习。
显示 81 道题
- 数据库的基本概念和数据库的分类 基础与综合
- 关系型数据库和非关系型数据库区别 基础与综合
- 数据库三范式 表设计与数据类型
- 手写 SQL:表中有 user_id 和 price 两个字段,查出 user_id = 1 时的最大 price SQL 语句与练习
- 手写 SQL:删除表中重复的数据,只保留其中一条记录 SQL 语句与练习
- 手写 SQL:查询前七天数据 SQL 语句与练习
- 手写 SQL:查询销量前十的商品信息 SQL 语句与练习
- 手写 SQL:有一张订单表,status 字段表示某个订单的状态,如何查询出各个状态的百分比 SQL 语句与练习
- 手写 SQL:有学生表和成绩表,请分别查询没考试的学生信息、参加了两门考试的学生 SQL 语句与练习
- 手写 SQL:计算新用户首日留存率 SQL 语句与练习
- 口述:MySQL 如何做基于权重的搜索? SQL 语句与练习
- where 和 having 的区别 SQL 语句与练习
- innerjoin、leftjoin、rightjoin、union 的区别 SQL 语句与练习
- drop、turncate、delete 的区别 SQL 语句与练习
- char 和 varchar 的区别,哪个索引效率更高? 表设计与数据类型
- datetime 和 timestamp 的区别 表设计与数据类型
- MySQL 组成部分,一条 SQL 查询语句怎么执行的 执行过程与存储引擎
- 还知道有什么存储引擎么(MyISAM),这些存储引擎的区别 执行过程与存储引擎
- InnoDB count(*) 要全表扫描,为什么不像 MyIsam 一样保存表的具体行数呢? 执行过程与存储引擎
- InnoDB 存储引擎的数据组织形式 执行过程与存储引擎
- MySQL 是怎么存储 NULL 的? 表设计与数据类型
- MySQL 建表需要注意什么 表设计与数据类型
- MySQL 索引底层结构(B/B+ 树原理与区别) 索引
- B 树对比 B+ 有什么优点吗?有没有什么场景用的是 B 树而不是 B+ 树? 索引
- 你了解的数据库(除了 MySQL)还有哪些结构的索引 索引
- MySQL 索引为什么要用 B+ 树?为什么不用红黑树?为什么不用跳表? 索引
- B+ 树一般有多少层 索引
- 索引的优点和缺点(为什么要用索引) 索引
- 建索引的时候有什么需要遵循什么原则?(哪些字段适合建立索引) 索引
- 一张表最多可以创建多少个索引? 索引
- MySQL 都有哪些类型的索引 索引
- 唯一索引和普通索引有什么区别,该如何选择? 索引
- MySQL 聚集索引 (主键索引) 和非聚集索引 (辅助索引/普通索引) 的区别 索引
- 主键索引和唯一索引的区别 索引
- 什么是外键?大企业为什么不推荐使用外键 表设计与数据类型
- 联合索引的最左匹配原则:为什么得最左匹配,不按照这个来为什么失效? 索引
- 索引下推了解过么 索引
- 假如有(a,b,c) 联合索引,查询语句条件是 a = x and b > y and c = z,分析索引使用情况 索引
- 假如有(a,b,c) 联合索引,select * from table where c = x and b = x and a = x 这条语句能用到(a,b,c)联合索引吗,sql 执行之前是否会将 c b a 的查询顺序改为 a b c 吗? 索引
- 如何评价下述这样的联合索引的组织方式?将联合索引(A,B)设计成先分别以 A 和 B 构建两棵 B+ 树,然后将 A 字段的 B+ 树的叶子结点指向 B 字段的 B+ 树 索引
- 优化 SQL 语句:select * from t where t.a > ? and t.b = ? or t.c = ? order by t.d desc limit 10 查询优化与连接池
- 讲讲回表查询和覆盖索引,为什么需要覆盖索引 ,可以使用覆盖索引优化的场景 索引
- 前缀索引了解吗,为什么要建前缀索引 索引
- select * from A join B on A.id = B.id;执行过程性能差,原因可能是?哪里需要建立索引? 索引
- 什么情况下用 like 查询(模糊查询)效率会比较低? 查询优化与连接池
- 全文索引和倒排索引 索引
- 索引在哪些情况下会失效 索引
- 主键乱序 insert 和顺序 insert 的性能对比(页分裂问题) 索引
- 说一下 MySQL 的事务(ACID 特性) 事务与锁
- MySQL 具体有哪些锁、粒度和开销 事务与锁
- 为什么要有意向锁? 事务与锁
- InnoDB 有哪几种行锁? 事务与锁
- InnoDB 行锁的内部实现原理是什么 事务与锁
- 一条 update 语句没有带 where 条件 / 带了 where 条件没有命中索引、两条 update 语句更新同一条记录 / 更新同一条记录的不同字段,分别加的是什么锁 事务与锁
- 什么情况下会加临键锁、什么情况下会加记录锁(加锁规则) 事务与锁
- MySQL 自增锁 事务与锁
- MySQL 会出现死锁吗?什么场景? 事务与锁
- 数据库的悲观锁和乐观锁怎么实现 事务与锁
- 有哪些隔离级别,分别解决什么问题(丢失更新、脏读、不可重复读、幻读) 事务与锁
- 四种隔离级别是怎么实现的(详细说说 MVCC 的原理) 事务与锁
- MySQL 解决幻读了吗,是如何解决的 事务与锁
- 先 update 再 select,update 操作没 commit 之前执行 select 会阻塞吗? 事务与锁
- 目前很多电商公司都把隔离级别设置为了读已提交,为什么这样设置,优缺点? 事务与锁
- binlog、redolog、undolog 的区别和作用 日志与恢复
- 为什么说 redolog 具有崩溃恢复的能力 日志与恢复
- redolog 怎么做崩溃恢复的(redo log 如何保证事务持久性 / WAL 策略、CheckPoint 技术) 日志与恢复
- 一条 SQL 更新语句是如何执行的(redo log 两阶段提交、redo log 和 bin log 一致性问题) 日志与恢复
- 事务还没提交的时候,redo log 有没有可能被持久化到磁盘呢?(MySQL 是如何保证数据不丢失的呢?) 日志与恢复
- MySQL 主从复制原理 复制与扩展
- MySQL 主从/主备如何保证数据一致性? 复制与扩展
- 如何保证 MySQL 高可用 复制与扩展
- 什么是慢 SQL (慢查询)?如何分析 (Explain、Profiling) 查询优化与连接池
- 怎么提高 MySQL 读写效率(SQL 优化) 查询优化与连接池
- 数据库是如何实现分页的,假设有 100 万条数据如何优化分页查询? 查询优化与连接池
- 数据库分库分表了解过吗,具体讲一下什么场景,怎么做 复制与扩展
- 说一下数据库路由组件怎么实现的 复制与扩展
- 分库分表中间件了解么 复制与扩展
- 数据库从旧表切换到新表,怎么做到对用户无感? 复制与扩展
- MySQL 的性能极限和瓶颈是什么样的,具体的表现是什么样的。怎么确认性能瓶颈是数据库出现瓶颈还是你的 JavaWeb 程序出现瓶颈 查询优化与连接池
- 介绍下 MySQL 线程池、启动 MySQL 线程池配置参数相关的有哪些 查询优化与连接池
- 数据库连接池有哪些?连接池的作用?如何合理设置连接池参数? 查询优化与连接池

评论 0 友善交流,让每个问题都有回响
还没有评论,分享你的看法吧。