MYISAM存储引擎介绍,特性(和innodb对比),优势,物理文件,表存储格式(静态表,动态表,null记录,压缩表)
目录
MYISAM存储引擎
介绍
特性(和innodb对比)
优势
物理文件编辑
表存储格式
介绍
静态格式表
特点
适用场景
动态格式表
特点
null记录
意义
压缩格式表
MYISAM存储引擎
介绍
mysql5.5版本之前的默认存储引擎
- 查询效率极高(支持b+树索引和全文索引) + 表占用空间小(数据压缩) + 免费开源
- 表级锁,读写并发较差,适用于只读/主要是读
适合 早期开发阶段,数据量不大的时候,查询快且管理简单
- 但不适合大规模数据的事务处理,因为不支持事务,一旦宕机可能会丢失部分数据
在 mysql5.5之后,InnoDB 成为默认存储引擎
- 因为它支持事务、行锁,并发性能更强,更适合大规模数据管理
特性(和innodb对比)
innodb是在myisam的基础上实现的,继承了它的一些优点,也补足了一些缺点
这里myisam相对innodb来说:
- 不支持外键/事务/MVCC/哈希索引
- 最大存储限制 -- 256tb
优势
MyISAM表的最大行数为(2^32)^2 及 (1.844E+19)行
每个MyISAM表最多可以创建64个索引,每个索引最多可以包含16个列
- 一般一张表中索引设置3-5个就够了
- 因为索引 本身占据空间 + 写入数据会更新索引结构
支持并发插入
通过create table创建表时,指定DATA DIRECTORY选项和INDEX DIRECTORY选项将数据文件和索引I文件放在不同设备的不同目录中,从而提高访问速度
- 数据文件和索引文件分开存放,可以让不同用户分别访问两个文件,互相不影响,减少磁盘 I/O 竞争,从而提高访问效率
BLOB和TEXT数据类型的列也可以被索引
- 可以使用全文索引
在索引列中允许使用NULL值
如果mysqld启动时设置了myisam_recover_options系统变量,那么MylSAM表在打开时进
行会自查,如果上一次表没有正确关闭将会修复
表中VARCHAR和CHAR列的长度总和最多可达64KB
UNIQUE约束的长度不受限制
物理文件
8.0是.sdi,之前的版本是.frm
- 两种格式的文件作用相同
表存储格式
介绍
使用myisampack实用工具对MylSAM表进行压缩/解压操作
静态格式表
- 最简单最安全(不容易损坏)最快的磁盘格式
- 每行占用的存储空间固定,检索方便,便于计算内存地址
- 即使数据字段实际长度小于定义的列宽,也会填充到固定长度
特点
- 每null列额外占用一位,四舍五入到最接近的字节
- null记录大致应该是这样(手册中没提):
- 或者在每一列后增加1bit? 有谁懂的能说说吗
适用场景
动态格式表
特点
列类型是字符串
- 除长度<4的字符串列外,所有字符串列都是动态的
每一行都有一个标志来指示行有多长
- 当因更新操作而变得更长时,数据可能存储在不连续的空间
- 可以使用OPTIMIZE TABLEtable_name语句或myisamchk-r对表进行碎片整理
每个允许为NULL的列,都用一个1BIT的额外空间记录当前列是否为空
- 和静态格式表的一样
每行前面都有一个bitmap(位图)
- 用来记录包含空字符串或0的列
- 如果字符串类型的列长度为零,或者数字列的值0,则在位图中标记并且不会保存到磁盘
- 不包括包含null值的列 (空字符串/0值 和 null值 在mysql中含义不同)
通常磁盘空间占用比固定长度表要少很多
null记录
- 会将允许为空的列与位图中某一位关联起来 (从右往左排列)
位图中值的含义:
- 如果位图中的值为0,表示列值不为空
- 为1,表示为空 (为空的列不在真实数据行中存在)
意义
对于静态表来说:
- 即使列值为null,依然也会占用完整存储空间
- 但可以快速知道哪些列是 NULL(is null查询时有用),并且区分 null值 和 空字符串/0值
对于动态表来说:
- 虽然null值不会占用空间,但也需要快速判断是否为null
压缩格式表
每行都单独压缩,每列都可能用单独的方式进行压缩:
有参考 -- 16.2.3 MyISAM 表存储格式_MySQL 8.0 参考手册