首页
功能面板
文章
更新公告

MySQL 高频面试问题整理(含原理 + 实战理解)

浏览量: 29
创建时间: 2025-12-30

MySQL 是后端、数据方向面试的必考项。很多人会用,但一问原理就卡壳。
这篇文章从面试真实高频问题出发,帮你一次性打通 MySQL 的核心知识点。


一、MySQL 常见存储引擎有哪些?InnoDB 为什么是默认?

常见存储引擎

  • InnoDB(默认)

  • MyISAM(基本淘汰)

  • Memory

  • Archive

InnoDB 的核心优势

  • ✅ 支持 事务

  • ✅ 支持 行级锁

  • ✅ 支持 外键

  • ✅ 支持 崩溃恢复(redo log)

📌 面试一句话回答

InnoDB 支持事务和行锁,能保证数据一致性和并发性能,所以成为默认引擎。


二、事务的四大特性(ACID)是什么?

特性含义Atomicity原子性,要么全成功要么全失败Consistency事务前后数据状态一致Isolation并发事务互不影响Durability提交后的数据不会丢失

📌 常被追问
👉 MySQL 是靠什么保证这些特性的?

  • 原子性:undo log

  • 持久性:redo log

  • 隔离性:锁 + MVCC

  • 一致性:以上共同保证


三、MySQL 有哪些隔离级别?默认是哪一个?

四种隔离级别

  1. Read Uncommitted(读未提交)

  2. Read Committed(读已提交)

  3. Repeatable Read(可重复读,默认)

  4. Serializable(串行化)

常见并发问题

问题是否出现脏读RU不可重复读RC幻读RR(InnoDB 基本解决)

📌 重点

MySQL 默认是 RR,但 InnoDB 通过 间隙锁 + MVCC 基本解决了幻读问题。


四、什么是 MVCC?解决了什么问题?

MVCC(多版本并发控制) 是 InnoDB 提供的一种机制。

核心思想

  • 每行数据都有多个版本

  • 通过 undo log + Read View 实现快照读

  • 读不加锁,写才加锁

解决的问题

  • 提高并发性能

  • 避免大量读写冲突

📌 面试简答版

MVCC 让读操作不阻塞写操作,通过版本控制提高并发能力。


五、MySQL 索引为什么能加快查询?

索引本质

索引是 排好序的数据结构

InnoDB 默认使用 B+Tree 索引。

为什么不用 B 树 / 哈希?

  • B+Tree 适合范围查询

  • 磁盘 IO 次数少

  • 叶子节点有序,支持排序和区间


六、什么情况下索引会失效?(面试超高频)

❌ 常见索引失效场景:

  1. 使用 LIKE '%xxx'

  2. 索引列参与计算

    where age + 1 = 20
    
  3. 隐式类型转换

    where phone = 123456
    
  4. 组合索引 不符合最左前缀

  5. 使用 OR,且部分条件无索引

📌 面试官很爱追问这个


七、什么是最左前缀原则?

组合索引:

index(a, b, c)

可以命中:

  • a

  • a, b

  • a, b, c

不能命中:

  • b

  • b, c

  • c

📌 一句话

组合索引必须从最左列开始使用。


八、为什么 COUNT(*) 比 COUNT(字段) 快?

  • COUNT(*):统计行数

  • COUNT(字段):会忽略 NULL,需要判断

在 InnoDB 中:

  • COUNT(*) 会走最优执行计划

  • 不会真正取所有字段

📌 结论

推荐使用 COUNT(*)


九、LEFT JOIN 很慢,可能是什么原因?

常见原因:

  1. 被驱动表数据量太大

  2. JOIN 字段未加索引

  3. where 条件写在错误位置

  4. 返回字段过多

📌 优化方向

  • 小表驱动大表

  • JOIN 字段建索引

  • 用 EXPLAIN 分析执行计划


十、EXPLAIN 主要看哪些字段?

字段含义type访问类型(越接近 const 越好)key使用的索引rows预估扫描行数extra是否使用临时表、排序

📌 面试官最喜欢问

type 出现 ALL 基本就是性能问题


十一、MySQL 为什么会出现死锁?

死锁原因:

  • 多个事务

  • 锁顺序不一致

  • 互相等待资源

解决方式

  • 保证访问顺序一致

  • 控制事务粒度

  • 合理拆分事务

📌 InnoDB 会自动检测并回滚一个事务


十二、MySQL 如何做性能优化?(终极题)

面试可按 四个层次回答

  1. SQL 层

    • 避免 select *

    • 合理索引

  2. 表结构

    • 合理字段类型

    • 控制字段长度

  3. 架构层

    • 读写分离

    • 分库分表

  4. 缓存层

    • Redis

    • 本地缓存


结语

MySQL 面试不怕问细,就怕你只会背
理解 事务、索引、锁、执行计划,基本可以覆盖 80% 的面试问题。

建议:
每一个知识点,都能结合一次 真实 SQL + EXPLAIN 来理解。