文章目录
-
- 一、什么是存储引擎(一句话版)
- [二、InnoDB vs MyISAM 核心区别总览(必背表)](#二、InnoDB vs MyISAM 核心区别总览(必背表))
- [三、InnoDB 特点(面试重点)](#三、InnoDB 特点(面试重点))
-
- [1️⃣ 支持事务(ACID)](#1️⃣ 支持事务(ACID))
- [2️⃣ 行级锁 + MVCC(高并发神器)](#2️⃣ 行级锁 + MVCC(高并发神器))
- [3️⃣ 崩溃恢复能力强](#3️⃣ 崩溃恢复能力强)
- [4️⃣ 聚簇索引(必须会说)](#4️⃣ 聚簇索引(必须会说))
- [四、MyISAM 特点(现在主要是"认识即可")](#四、MyISAM 特点(现在主要是“认识即可”))
-
- [1️⃣ 不支持事务、不支持行锁](#1️⃣ 不支持事务、不支持行锁)
- [2️⃣ 读性能高(历史原因)](#2️⃣ 读性能高(历史原因))
- [3️⃣ 崩溃风险大](#3️⃣ 崩溃风险大)
- 五、存储引擎的选择原则(面试标准答案)
-
- [✅ 90% 场景:InnoDB](#✅ 90% 场景:InnoDB)
- [⚠️ 特殊场景:MyISAM(了解即可)](#⚠️ 特殊场景:MyISAM(了解即可))
- [六、如何查看 & 配置存储引擎(实操必会)](#六、如何查看 & 配置存储引擎(实操必会))
-
- [1️⃣ 查看当前 MySQL 支持的引擎](#1️⃣ 查看当前 MySQL 支持的引擎)
- [2️⃣ 查看某张表的存储引擎](#2️⃣ 查看某张表的存储引擎)
- [3️⃣ 建表时指定存储引擎](#3️⃣ 建表时指定存储引擎)
- [4️⃣ 修改表的存储引擎](#4️⃣ 修改表的存储引擎)
- [5️⃣ 设置默认存储引擎](#5️⃣ 设置默认存储引擎)
一、什么是存储引擎(一句话版)
存储引擎 = 表的"数据存放方式 + 读写规则"
-
同一个 MySQL
-
不同表
-
可以用不同存储引擎
就像同一栋楼里:
-
有的房间是钢筋混凝土(InnoDB)
-
有的是木结构(MyISAM)
二、InnoDB vs MyISAM 核心区别总览(必背表)
| 维度 | InnoDB(默认) | MyISAM |
|---|---|---|
| 事务 | ✅ 支持(ACID) | ❌ 不支持 |
| 锁 | 行级锁 | 表级锁 |
| 并发性能 | ⭐⭐⭐⭐ | ⭐ |
| 外键 | ✅ 支持 | ❌ 不支持 |
| 崩溃恢复 | ✅ redo / undo | ❌ 易损 |
| MVCC | ✅ | ❌ |
| 适合场景 | 高并发、核心业务 | 读多写少、统计类 |
| MySQL 8 默认 | ✅ | ❌ |
👉 一句话记忆法
要安全、要并发、要事务 → InnoDB
要快读、要简单、不怕挂 → MyISAM
三、InnoDB 特点(面试重点)
1️⃣ 支持事务(ACID)
-
原子性、一致性、隔离性、持久性
-
Spring 事务底层默认依赖 InnoDB
❗ 面试雷点
"Spring 事务失效有可能是因为表不是 InnoDB"
2️⃣ 行级锁 + MVCC(高并发神器)
-
更新一行 ≠ 锁整张表
-
读写并发不卡顿
-
多版本并发控制(快照读)
📌 典型场景:
-
下单
-
扣库存
-
转账
3️⃣ 崩溃恢复能力强
-
redo log + undo log
-
MySQL 异常宕机,重启后能自动恢复
4️⃣ 聚簇索引(必须会说)
-
主键索引 = 数据本身
-
二级索引保存的是 主键值
二级索引 -> 主键 -> 数据
❗ 面试追问:
为什么 InnoDB 推荐使用自增主键?
四、MyISAM 特点(现在主要是"认识即可")
1️⃣ 不支持事务、不支持行锁
-
更新一条数据
-
整张表被锁住 😵
2️⃣ 读性能高(历史原因)
-
索引和数据分开存
-
全表扫描、统计速度快
3️⃣ 崩溃风险大
-
容易表损坏
-
修复成本高
👉 所以:
生产环境几乎不用 MyISAM 了
五、存储引擎的选择原则(面试标准答案)
✅ 90% 场景:InnoDB
| 业务 | 推荐 |
|---|---|
| 用户、订单、支付 | InnoDB |
| 高并发接口 | InnoDB |
| 有事务需求 | InnoDB |
| 微服务 | InnoDB |
⚠️ 特殊场景:MyISAM(了解即可)
| 场景 | 原因 |
|---|---|
| 只读数据 | 结构简单 |
| 历史归档 | 不需要事务 |
| 临时统计表 | 追求极致读 |
六、如何查看 & 配置存储引擎(实操必会)
1️⃣ 查看当前 MySQL 支持的引擎
SHOW ENGINES;
2️⃣ 查看某张表的存储引擎
SHOW TABLE STATUS LIKE 'user';
或
SHOW CREATE TABLE user;
3️⃣ 建表时指定存储引擎
CREATE TABLE user ( id BIGINT PRIMARY KEY, name VARCHAR(50) ) ENGINE=InnoDB;
4️⃣ 修改表的存储引擎
ALTER TABLE user ENGINE=InnoDB;
⚠️ 生产环境操作要谨慎,可能锁表
5️⃣ 设置默认存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';
SET default_storage_engine=InnoDB;