当前位置: 首页 > news >正文

Mysql 中 MyISAM vs InnoDB

以下是 MyISAM vs InnoDB 的全面对比表,可以帮助你系统掌握两者在功能、性能、应用场景等方面的区别👇

分类InnoDBMyISAM
✅ 默认引擎✅ 是(MySQL 5.5 之后默认)❌ 否(MySQL 5.5 之前默认)
📦 存储结构表结构 .frm + 数据+索引 .ibd 或共享表空间.frm + .MYD(数据)+ .MYI(索引)
📌 索引类型聚簇索引(主键索引的叶子节点存整行数据)非聚簇索引(叶子节点存物理地址)
🔐 锁机制行级锁 + 表级锁 + 间隙锁(支持事务隔离)表级锁(写锁会阻塞所有读)
🔄 事务支持✅ 支持事务、回滚、崩溃恢复❌ 不支持事务
💾 崩溃恢复✅ 支持 crash-safe(redo log + undo log)❌ 崩溃容易导致数据损坏
🚦 并发性能高(行级锁 + MVCC)低(写时锁整个表)
🧠 MVCC 支持✅ 支持❌ 不支持
🔍 全文索引✅ 从 MySQL 5.6 开始支持✅ 早期支持(MySQL 5.5 及以前)
🔑 外键✅ 支持❌ 不支持
📊 适合场景写多读多、有事务要求、强一致性读多写少、对事务不敏感、只读数据
⚠️ 幻读控制✅ 有隔离级别控制(如 RR)❌ 不支持,不能避免幻读
📈 查询速度二级索引需要回表查询读取索引后直接定位数据文件,纯读速度快
🛠️ 工具兼容✅ mydumper、xtrabackup 等全面支持❌ 一些工具不兼容,如 xtrabackup 不支持备份

索引和数据存储方式

“MyISAM 索引和数据分离,而 InnoDB 索引和数据在一起”

🧱 一、MyISAM:索引和数据分开存储

✅ 文件结构回顾

假设有个 MyISAM 表 user,会生成三个文件:

文件类型文件名内容
表结构user.frm表定义
数据文件user.MYD存储数据本体
索引文件user.MYI存储所有索引

✅ 索引结构

  • MyISAM 的索引是典型的 B+ 树结构
  • 叶子节点存储的是数据的物理地址(指针),不是数据本身
  • 查数据过程是“两步走”:
    1. 先查索引定位数据文件的位置
    2. 再去 .MYD 文件里根据地址把数据读出来
📌 举个例子:

执行:

SELECT name FROM users WHERE id = 1001;

流程是:

  1. .MYI 文件(索引文件)里找到 id=1001 的地址(比如偏移量 2000)
  2. .MYD 数据文件偏移 2000 读取整行数据
  3. 取出 name 字段返回

所以:MyISAM 的索引叶子节点只保存地址,不保存数据本身

🌳 二、InnoDB:聚簇索引,索引和数据存一起

InnoDB 的主键索引是 Clustered Index(聚簇索引)

✅ 聚簇索引结构

  • InnoDB 也是 B+ 树结构
  • 主键索引的叶子节点就直接存储了整行数据
  • 所以:
    • 查主键时:一步到位
    • 查二级索引时:还要再回主键索引(称为“回表”)

📌 举个例子:

表结构:

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(100),
  age INT
) ENGINE=InnoDB;
主键查询:
SELECT * FROM users WHERE id = 1;
  • 直接在主键 B+ 树上查到 id=1 的叶子节点
  • 叶子节点中就包含了整行 id, name, age,不需要“跳出去”查数据
二级索引查询:
SELECT name FROM users WHERE age = 20;
  • age 是二级索引
  • 先用二级索引找到对应的主键 id
  • 然后去主键聚簇索引里“回表”查整行数据

🔍 总结对比图

特性MyISAMInnoDB
索引类型B+ 树B+ 树
主键索引叶子节点存储数据地址存储整行数据
数据与索引存储位置分离(MYD/MYI)一体(聚簇索引)
主键查找效率要跳两次(查地址+查数据)一次查找,效率更高
二级索引也存地址存主键值,需要“回表”

📌 为什么 InnoDB 用聚簇索引?

  • 让主键查询更快:常见的主键查找一跳就搞定
  • 支持事务和行锁:聚簇索引是实现 MVCC 的基础
  • 减少磁盘 I/O:数据和主键放一起,避免多次跳转

MyISAM 的索引和数据是分离的(索引指向数据地址)
InnoDB 的主键索引和数据是在一起的(聚簇索引)

这个差异对性能、事务、锁机制都有很大影响,也是 InnoDB 被默认采用的重要原因之一。

🔍 总结一句话:

  • InnoDB:现代数据库首选,适合事务型、并发写多、强一致场景。
  • MyISAM:轻量、只读性能高,但不支持事务,不 crash-safe,不建议新项目使用。
http://www.dtcms.com/a/112550.html

相关文章:

  • windows技术基础知识
  • 14.mybatis源码解析
  • 使用MCP服务器实现AI任务完成通知:让Cursor更智能
  • Floyd 算法 Java
  • Go/Rust 疯狂蚕食 Java 市场?老牌语言的 AI 化自救之路
  • 自编码器(AutoEncoder)概念解析与用法实例:压缩数字图像
  • 使用人工智能大模型DeepSeek,如何免费辅助教学?
  • 如何实现单例模式?
  • Java常用工具算法-4--签名算法(RSA,ECDSA,HMAC等)
  • 不同路径I
  • 洛谷题单3-P1720 月落乌啼算钱(斐波那契数列)-python-流程图重构
  • 迪杰斯特拉+二分+优先队列+拓扑+堆优化(奶牛航线Cowroute、架设电话线dd、路障Roadblocks、奶牛交通Traffic)
  • Leetcode 437 -- dfs | 前缀和
  • 大数据概念介绍
  • 高可用完全分布式集群启动命令
  • 基于 Java 的异步任务管理器的设计与实现方案
  • Currying柯里化
  • 【教程】Windows下 Xshell 连接跳板机和开发机
  • 基于PI控制和卡尔曼滤波的光通信相位偏差估计和补偿算法matlab仿真
  • 前端快速入门学习1——使用工具
  • [ISP 3A ] AE的常用算法分析
  • chown和chmod的区别
  • 使用内存数据库来为mapper层的接口编写单元测试
  • AI大模型时代前后端技术演进:MCP神经中枢架构下的技术栈抉择
  • Java项目之基于ssm的教务信息平台的设计与实现
  • 算法思想之双指针(一)
  • 深度学习处理文本(11)
  • Prolog语言的移动UI设计
  • COBOL语言的数据库交互
  • Pascal语言的设备管理