【MySQL】存储引擎 - MyISAM详解
📢博客主页:https://blog.csdn.net/2301_779549673
📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨
文章目录
- 🏳️🌈一、MyISAM 存储引擎的特性
- 🏳️🌈二、MyISAM 的主要优势
- 🏳️🌈
- 🏳️🌈四、MyISAM 表存储格式
- 4.1 静态格式(Fixed-Length)表
- 4.2 动态格式表
- 4.3 压缩存储格式
- 👥总结
MySQL 5.5 之前默认的存储引擎
使用 MyISAM
存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要是读的场景。
🏳️🌈一、MyISAM 存储引擎的特性
MyISAM
和 InnoDB
的主要区别
- 外键
- 事务
- Hash 索引
- 锁粒度
🏳️🌈二、MyISAM 的主要优势
- MyISAM 表的最大行数为(232)^2及(1.844E+19)行;
- 每个MyISAM表最多可以创建64个索引,每个索引最多可以包含16个列;
- 支持并发插入;
- 通过
CREATE table
创建表时,指定DATA DIRECTORY=PATH
和INDEXDIRECTORY=PATH
将数据文件和索引文件放在不同设备的不同目录中,从而提高访问速度: BLOB
和TEXT
数据类型的列也可以被索引;- 在索引列中允许使用NULL值;
- 如果
mysqld
启动时设置了myisam_recover_options
系统变量,那么 MyISAM 表在打开时进行会自查,如果上一次表没有正确关闭将会修复; - 表中
VARCHAR
和CHAR
列的长度总和最多可达64KB。 UNIOUE
约束的长度不受限制
🏳️🌈
在MySOL8.0中 InnoDB 是默认引擎,所以在创建表时需要指定 ENGINE=MyISAM
创建
MyISAM
表会根据表名生成三个不同后缀名文件,分别是以.MYD
(MYData)为后缀的数据文件,以.MYI
(MYIndex)为后缀的索引文件,以.sdi
为后缀的表信息描述文件(JSON格式)
在8.0以前的版本中表信息描述文件是以.frm
为后缀的二进制文件
🏳️🌈四、MyISAM 表存储格式
- MyISAM 表支持三种不同的存储格式,
- 其中
FIXED
静态(固定)格式和DYNAMIC
动态格式,根据使用的列类型自动选择, - 第三种是
压缩格式
,只能使用myisampack
实用程序生成并且是只读格式
- 其中
- 当表中没有
BLOB
或TEXT
数据类型的列,在使用 CREATE TABLE或 ALTER TABLE 语句创建或修改表时,可以结合 ROW_FORMAT表选项将表格式设置为FIXED或DYNAMIC。 - 使用 myisamchk 实用工具对已压缩的MyISAM进行解压操作,myisamchk --unpack。
4.1 静态格式(Fixed-Length)表
- 静态格式是
MyISAM
表的默认格式,当表不包含可变长度的列(VARCHAR
、VARBINARY
、BLOB
或TEXT
)时使用,每行都使用固定数量的字节存储。 - MyISAM 的三种存储格式中,静态格式是最简单和最安全的(最不容易损坏),同时也是最快的磁盘格式,因为每行的长度固定,根据索引中的行号乘以行长度就可以计算出行位置,此外,读取固定数量的行也非常的高效。
- 静态格式表具有以下特点:
CHAR
和VARCHAR
类型的列用空格填充到指定的列宽;BINARY
和VARBINARY
类型的列用0x00
字节填充到列宽- 每个允许为NULL的列,都用一个
1 BIT
的额外空间记录当前列是否为空;。 - 速度非常快,且易于缓存;。
- 崩溃后易于重建,因为行都位于固定位置,。
- 通常需要比动态格式表更多的磁盘空间;。
4.2 动态格式表
当表中包含可变长度列(VARCHAR
、VARBINARY
、BLOB
或 TEXT
)或者在创建表时使用 ROW_FORMAT=DYNAMIC
选项,则表格式为动态存储格式
动态格式表具有以下特点:
- 列类型是字符串,且长度大于等于4,长度都是动态的:
- 每一行都有一个标志来指示行有多长,当因更新操作而变得更长时,数据可能存储在不连续的空间,可以使用
OPTIMIZE TABLE table_name
语句或myisamchk -r
对表进行碎片整理; - 每个允许为NULL的列,都用一个
1 BIT
的额外空间记录当前列是否为空; - 每行前面都有一个
bitmap
(位图),用来记录包含空字符串或0的列,如果字符串类型的列长度为零,或者数字列的值0,则在位图中标记并且不会保存到磁盘; - 通常磁盘空间占用比固定长度表要少很多;。
- 每行都单独压缩,每列都可能用单独的方式进行压缩。
常用的压缩方式:
- 如果数值列的值为0,无论原始数据类型是哪种都用一个
BIT
类型存储。 - 如果整数列中的值范围较小,则尽可能使小的类型存储该列,比如:列中的值范围在 -128 到 127 之间,即使原始类型为
bigint
(8bytes),也使用TINYINT
(1 byte) 类型存储 - 如果列中只有一小组可能出现的值,则数据类型转换为
ENUM
;
4.3 压缩存储格式
- 压缩存储格式是使用
myisampack
工具生成的只读格式数据表,压缩表可以用myisamchk
解压缩。 - 压缩格式表具有以下特点:
- 压缩表占用很少的磁盘空间,最大限度地减少了磁盘使用:
- 可以用于固定长度或动态长度行
- 压缩表是只读的,因此不能在表中更新或添加数据:
👥总结
本篇博文对 【MySQL】存储引擎 - MyISAM详解 做了一个较为详细的介绍,不知道对你有没有帮助呢
觉得博主写得还不错的三连支持下吧!会继续努力的~