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;


相关推荐
liux35286 分钟前
从零开始学MySQL:入门基础篇(一)
数据库·mysql·oracle
笃行客从不躺平24 分钟前
PG SQL 行转列记录
数据库·sql
難釋懷41 分钟前
Redis桌面客户端
数据库·redis·缓存
心态还需努力呀43 分钟前
国产时序数据库进入深水区:2026 年的技术分化与融合式架构趋势解析
数据库·架构·时序数据库
填满你的记忆1 小时前
【从零开始——Redis 进化日志|Day5】分布式锁演进史:从 SETNX 到 Redisson 的完美蜕变
java·数据库·redis·分布式·缓存
lendsomething1 小时前
Spring 多数据源事务管理,JPA为例
java·数据库·spring·事务·jpa
stark张宇1 小时前
逃离 Docker Hub 限速!国内镜像 + 完整 Docker Compose 部署 Node 与 MySQL 服务
mysql·docker·容器
玩转数据库管理工具FOR DBLENS1 小时前
人工智能:演进脉络、核心原理与未来之路 审核中
数据库·人工智能·测试工具·数据库开发·数据库架构
晓风残月淡1 小时前
高性能MYSQL(四):查询性能优化
数据库·mysql·性能优化
cab51 小时前
MyBatis如何处理数据库中的JSON字段
数据库·json·mybatis