2026 最新 MySQL 面试题 20 例(从基础到高级)
整理20道2026年MySQL面试真题,覆盖基础语法、索引、事务锁、SQL优化、MVCC、主从复制,附带SQL实例,后端面试复习必备。
MySQL 后端开发面试是技术面试高频板块,不管是初级开发、全栈工程师还是运维岗位,都会考察 MySQL 基础语法、索引原理、事务锁、SQL 优化等内容。本文神器阁整理20道真实面试高频题,覆盖基础、进阶、高级知识点,搭配简单实例,方便面试复习。

一、基础篇(1~7题)
1. MySQL 有哪些常用存储引擎?InnoDB 和 MyISAM 的核心区别?
核心答案:常用存储引擎:InnoDB、MyISAM、Memory。MySQL5.5之后默认引擎是InnoDB。
InnoDB:支持事务、行级锁、外键、崩溃安全恢复;聚集索引,数据和索引放在一起;支持MVCC。
MyISAM:不支持事务,表级锁;查询速度快;不支持崩溃安全恢复,容易丢数据;非聚集索引。
实例:
-- 查看当前表存储引擎 show create table user; -- 创建表指定引擎 create table test_myisam(id int) engine=myisam;
2. 什么是事务?事务四大特性 ACID 分别是什么?
事务是一组SQL语句,要么全部执行成功,要么全部失败回滚。
A(Atomicity)原子性:事务不可拆分。
C(Consistency)一致性:事务执行前后数据状态合法。
I(Isolation)隔离性:多个事务之间互不干扰。
D(Durability)持久性:事务提交后,数据永久保存。
实例:转账操作,A扣钱、B加钱,任意一步失败,全部回滚。
start transaction; update account set money=money-100 where id=1; update account set money=money+100 where id=2; commit; -- 提交;rollback 回滚
3. MySQL 事务隔离级别有哪4种?默认级别是什么?
4个隔离级别(从低到高)
读未提交(Read Uncommitted):能读到其他事务未提交数据,脏读。
读已提交(Read Committed,RC):只能读到已提交数据,存在不可重复读。
可重复读(Repeatable Read,RR):MySQL InnoDB 默认隔离级别,解决不可重复读,存在幻读。
串行化(Serializable):最高级别,加表锁,完全隔离,性能最差。
脏读:读到别的事务未提交数据;不可重复读:同一事务多次读取同一数据结果不一样;幻读:同一事务范围查询,其他事务插入新数据。
4. char 和 varchar 的区别?
char:固定长度字符串。长度不足会空格填充,查询更快,浪费空间。适合长度固定数据,如手机号、身份证号。
varchar:可变长度字符串。占用空间随实际内容变化,节省存储;读取略慢。适合长短不一文本,用户名、备注。
实例:char(10) 存abc,占用10字节;varchar(10)存abc,占用3字节+长度标识。
5. 什么是主键、唯一索引?两者区别?
主键(primary key):唯一标识一行,不能为NULL,一张表只能一个主键。主键属于聚集索引。
唯一索引(unique):字段值不能重复,允许NULL(可以多个null),一张表可以多个唯一索引。
alter table user add unique uk_phone(phone);
6. MySQL 常用数据类型有哪些?int(11)代表什么?
常用:int、bigint、varchar、char、datetime、timestamp、decimal。
int(11) 不是限制存储11位数字,只是显示宽度,不限制存储范围。
int固定4字节。金额要用decimal,不要用float/double,存在精度丢失。
7. 什么是联合主键?联合索引最左前缀原则?
联合索引由多个字段组成,例如 idx_a_b(a,b)。
最左前缀原则:查询要匹配索引最左边字段,才能命中索引。
索引 idx_a_b(a,b):where a=1 可以走索引;where b=2 无法走索引。
二、进阶篇(8~14题)
8. 索引是什么?索引优缺点?
索引是数据库用于快速查找数据的数据结构,InnoDB索引底层是B+树。
✅优点:大幅提升查询速度;减少排序、分组IO。
❌缺点:占用磁盘空间;增删改SQL会维护索引,降低写入性能。
索引不是越多越好,频繁更新的字段不要建索引。
9. B树和B+树区别,为什么InnoDB选用B+树?
B树:每个节点存数据+索引,叶子节点不相连。
B+树:非叶子节点只存索引,全部数据放在叶子节点;叶子节点用链表串联。
InnoDB选择B+树原因:
非叶子节点更小,一页能存放更多索引,IO次数更少。
叶子链表,范围查询(大于、小于)遍历方便。
查询稳定:任何查询都要走到叶子节点。
10. 什么是覆盖索引?
覆盖索引:查询字段全部包含在索引里,不需要回表读取原始数据。
表user,索引idx_name_phone(name,phone)
-- 覆盖索引,直接从索引拿name、phone,不回表 select name,phone from user where name='张三';
优化思路:尽量使用覆盖索引,减少回表。
11. explain 关键字作用?explain 重点看哪些字段?
explain用来分析SQL执行计划,判断索引是否生效。
重点字段:
type:访问类型,性能从优到劣:system > const > eq_ref > ref > range > index > ALL。ALL代表全表扫描,需要优化。key:实际使用索引。rows:预估扫描行数,越小越好。Extra:额外信息,Using filesort文件排序、Using temporary临时表,都是需要优化。
explain select * from user where id=1;
12. MySQL 行锁、表锁、意向锁分别什么时候触发?
表锁:MyISAM;
lock tables手动加锁;DDL语句。锁住整张表,并发差。行锁:InnoDB,只有通过索引检索数据才会触发行锁;不走索引,行锁升级表锁。
意向锁:InnoDB表级锁,分为意向共享IS、意向排他IX。意向锁不会阻塞行锁,用来快速判断表内是否存在行锁冲突。
13. SQL 慢查询怎么定位?慢查询日志作用?
慢查询日志记录执行时间超过阈值的SQL。
开启慢查询:
show variables like 'slow_query_log'; show variables like 'long_query_time'; -- 阈值,默认10秒
定位流程:开启慢日志 → 抓取慢SQL → explain分析执行计划 → 优化索引/改写SQL。
14. 什么是MVCC?实现原理?
MVCC(多版本并发控制),InnoDB实现可重复读隔离级别核心机制。
原理:每行数据保存版本链,事务读取时,读取快照版本,不加锁,提升读写并发。核心由undo log(回滚日志)+ read view实现。
undo log:保存数据旧版本。
read view:事务开启时生成,用来判断版本可见性。
三、高级篇(15~20题)
15. 什么是死锁?怎么避免死锁?
死锁:两个事务互相持有对方需要的锁,互相等待,无法释放。
示例:事务A锁行1,等待行2;事务B锁行2,等待行1。
避免方案:
更新多个行,统一顺序更新。
事务尽量简短,减少锁持有时间。
避免大事务中混合读写。
InnoDB自带死锁检测,发现死锁自动回滚代价小的事务。
16. 大表分页 limit offset 很大时,为什么慢?如何优化?
limit 100000,10:数据库扫描前100010行,丢弃前面10万行,返回10条,偏移量越大越慢。
优化方案:主键书签分页(推荐)
-- 不使用offset,记录上一页最大id select * from user where id > 100000 limit 10;
17. 什么是 binlog、redo log、undo log,三者作用?
redo log(重做日志):物理日志,保证事务持久性。崩溃恢复,刷盘前宕机,重启重做事务。InnoDB引擎日志。
undo log(回滚日志):保存数据旧版本,事务回滚;MVCC版本链。InnoDB引擎日志。
binlog(二进制日志):逻辑日志,记录SQL变更语句;主从复制、数据恢复。MySQL服务层日志。
两阶段提交:redo log prepare → 写binlog → redo log commit。保证binlog和redo log数据一致。
18. MySQL 主从复制原理?延迟产生原因?
主库写操作记录到binlog;从库IO线程拉取主库binlog写入relay log;从库SQL线程回放日志,同步数据。
延迟原因:
主库写入压力大,binlog生成速度大于从库回放。
从库机器性能差,SQL单线程回放(5.7默认单线程)。
大事务:主库执行很久,一次性推送大量日志。
19. 哪些情况索引会失效?
where条件索引字段做函数运算、隐式类型转换。
where name='123'name是varchar;where phone=13800138000phone字符串,数字匹配触发隐式转换。联合索引不满足最左前缀。
使用
!=、<>、not in。like 以%开头
like '%张三'。like '张三%' 前缀匹配,索引可以生效。
20. 数据库分库分表场景、水平拆分和垂直拆分区别?
垂直拆分:按字段拆分。一张大表拆多张表,分到不同库,例如用户基础信息表、用户扩展信息表。减少单表字段数量。
水平拆分:按数据行拆分。结构不变,把行分散到多个表,例如user_0、user_1,按id取模分片。适合单表数据量千万级以上。
分库分表问题:分布式事务、跨表join、分页排序复杂。

