MySQL 存储引擎:特点、区别与选型原则

文章目录

    • 一、什么是存储引擎(一句话版)
    • [二、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;


相关推荐
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
parade岁月1 天前
MySQL JOIN解析:朴实无华但食之有味
数据库·后端
用户3169353811831 天前
MySQL服务无法启动问题解决全记录
数据库
vivo互联网技术1 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
数据技术说1 天前
MySQL 迁移实战——如何实现真正的"零改造"平滑切换
mysql
倔强的石头_2 天前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库