讲师中心 微信公众号
AI工具推荐 视频效率加速

MySQL中InnoDB与MyISAM在磁盘存储上有哪些差异

酷静吖_2026

酷静吖_2026

发布时间:2026-10-08 08:35:03

|

221人浏览过

|

来源于php中文网

原创

InnoDB新建空表即占16KB,因其以页为最小I/O单元,默认页大小16KB,建表时即分配并初始化完整页结构;MyISAM则按需增长,.MYD可为0字节。

mysql中innodb与myisam在磁盘存储上有哪些差异

为什么新建空表就占16KB:InnoDB的页初始化机制

InnoDB新建空表时,.ibd 文件立刻就是16KB,不是bug,是设计使然。它的最小I/O单元是页(page),默认16KB,建表即分配一个完整页,并填入页头、infimum/supremum记录、空闲空间链表等元数据结构。MyISAM则不同:.MYD 可为0字节,.MYI 仅存根节点索引,通常几百字节起步。

这个差异直接影响小表场景下的磁盘感知:你执行 CREATE TABLE t (id INT) ENGINE=InnoDB 后立刻 ls -lh t.ibd,看到的就是 -rw-r----- 1 mysql mysql 16K;而同结构 MyISAM 表的 .MYD 很可能显示 0。

  • innodb_file_per_table=OFF 时,所有表挤在 ibdata1,初始就几百MB,且删库也不释放
  • 即使只插入一行,InnoDB仍占用整页;MyISAM按行实际长度+行头开销动态增长
  • 页内空闲空间不自动归还文件系统,DELETE后 du -sh 不变是正常现象

DELETE不缩文件:标记删除 vs 物理截断

InnoDB 的 DELETE FROM t WHERE ... 只是把记录打上删除标记,加入 purge 队列,对应页内的空闲空间保留在原页中供后续 INSERT 复用——它不合并页、不收缩文件、不归还磁盘给操作系统。MyISAM 则相反:执行 DELETE 后若触发重建(如 OPTIMIZE TABLE 或自动整理),会真正丢弃空洞、重写 .MYD 文件并截断尾部。

所以你执行完大范围 DELETE,观察 ls -lh t.ibd 和 du -sh t.ibd 均无变化,这不是空间泄漏,而是 InnoDB 的空间复用策略。要真正释放磁盘,必须显式重建:

  • OPTIMIZE TABLE t(仅当 innodb_file_per_table=ON 时有效)
  • ALTER TABLE t ENGINE=InnoDB(本质也是重建)
  • MyISAM 下同操作会直接重写 .MYD,效果立竿见影

聚簇索引导致数据无法“碎片化压缩”

InnoDB 强制主键索引与数据行物理共存于同一B+树,即“聚簇索引”。这意味着:主键值决定数据存放位置,非主键索引(二级索引)叶子节点存的是主键值而非行地址。这种结构带来I/O优势,但也锁死了空间复用逻辑——页内空洞只能被相同主键范围的新数据填充,无法像 MyISAM 那样把零散空洞拼成大片再分配。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

MyISAM 是堆表(heap table),数据按插入顺序追加,.MYD 中的空洞可被任意新行复用,配合 myisamchk --recover 还能主动整理。而 InnoDB 的页内空闲链表只服务本页,跨页合并需重建整个索引树。

  • 大量随机 DELETE + INSERT 后,InnoDB 表更容易出现“逻辑空洞多但物理文件不缩”的情况
  • MyISAM 的 .MYI 索引支持压缩(myisampack),InnoDB 的索引压缩(KEY_BLOCK_SIZE)作用有限,因聚簇结构限制了压缩粒度
  • 别指望 ROW_FORMAT=COMPRESSED 能大幅减小已存在空洞的 .ibd,它只影响新写入页

CHAR字段在InnoDB里真更省空间?别轻信

确实存在 InnoDB 表比 MyISAM 小的特例:比如全 CHAR(120) 字段、高比例 NULL 或尾部空格,且使用 ROW_FORMAT=DYNAMIC。这时 InnoDB 对 CHAR 尾部空格不存储,而 MyISAM 在 FIXED 行格式下会为每个 CHAR(120) 固定分配 120 字节。

但这只是边界案例,不可泛化:

  • 一旦字段含非空内容、或改用 VARCHAR,MyISAM 立刻反超(因索引分离+压缩)
  • MyISAM 的 .MYI 支持前缀压缩,InnoDB 二级索引无法享受同等压缩率
  • 真实业务中,这种“InnoDB更小”的表极少,且依赖具体填充模式,不具备可迁移性

真正影响磁盘体积的关键,从来不是字段类型微调,而是 innodb_file_per_table 是否开启、是否长期未重建、以及是否混用了大对象(如 TEXT 存储在溢出页)。这些比纠结 CHAR 尾部空格重要得多。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2113

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1299

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

755

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2872

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

4788

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1099

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5051

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

4482

2023.08.14

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 181人学习

使用phpenv集成环境安装极致CMS
使用phpenv集成环境安装极致CMS

共2课时 | 289人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn