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;


相关推荐
小无名呀2 小时前
使用C语言连接MySQL
数据库·c++·mysql
Elastic 中国社区官方博客2 小时前
使用 LocalAI 和 Elasticsearch 构建本地 RAG 应用
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
倔强的石头_2 小时前
【金仓数据库】ksql 指南(五) —— 创建与管理索引和视图(KingbaseES 查询优化核心)
数据库
粤M温同学2 小时前
Android Room数据库的基本使用
android·数据库
cypking2 小时前
三、NestJS 开发实战文档-->集成 MySQL(TypeORM)
前端·数据库·mysql·adb·node.js
码农水水2 小时前
大疆Java面试被问:Spring事务的传播行为详解
java·数据库·spring
逍遥德2 小时前
mysql-8.4.7-winx64.zip 安装/运行
数据库·mysql
lkbhua莱克瓦242 小时前
基础-约束
android·开发语言·数据库·笔记·sql·mysql·约束
falldeep2 小时前
LeetCode高频SQL50题总结
数据结构·数据库·sql·算法·leetcode·职场和发展