前言
- 在 MySQL 5.1 及之前的版本,MyISAM 是默认的存储引擎。
- MyISAM 提供了大量的特性,如:全文索引、压缩、空间函数(GIS)等;
- MyISAM 不支持事务和行级锁;
- 存在的缺陷:崩溃后无法安全恢复。
- 推荐:不要默认使用 MyISAM,而应该使用 InnoDB。
存储
- MyISAM 将表存储在两个文件中:数据文件(
.MYD
)和索引文件(.MYI
)。 - MyISAM 表可包含动态或静态(长度固定)行。会根据表的定义来决定采用何种行格式。
- MyISAM 表可存储的行记录数,一般受限于可用的磁盘空间,或者操作系统的单个文件的最大尺寸。
- 在 MySQL 5.0 中,MyISAM 表如果是变长行,则默认配置只能处理 256TB 的数据,因为指向数据记录的指针长度为 6 个字节。
- 在更早的版本中,指针长度是 4 个字节,所以只能处理 4GB 数据。
- 而所有的 MySQL 版本都支持 8 字节的指针。
- 若需要修改指针长度,可通过修改表的
MAX_ROWS
和AVG_ROW_LENGTH
选项的值来实现。两者的乘机就是表可能达到的最大大小。- 修改这个两个参数会导致重建整个表和表的所有索引,可能需要很长时间完成。
特性
- 加锁与并发
- MyISAM 对整张表加锁,而非针对行。
- 读取时会对需要读到的表加共享锁,写入时对标加排它锁。
- 但在表有读取查询的时候,可往表插入新的记录(又被称为:并发插入,
CONCURRENT INSERT
)
- 修复
- 对于 MyISAM 表,MySQL 可手动或自动执行检查和修复操作(与修复和事务恢复以及崩溃恢复概念不同)
- 执行表的修复可能导致一些数据丢失,而且修复操作非常慢。
- 可通过
CHECK TABLE mytable
检查表的错误。- 若有错误,可执行
REPAIR TABLE mytable
进行修复。
- 若有错误,可执行
- 若 MySQL 服务器已关闭,可通过
myisamchk
命令进行检查和修复操作。
- 索引特性
- 延迟更新索引键(Delayed Key Write)
压缩表
- 若表在创建并导入数据后,不在进行修改,这样的表更适合采用 MyISAM 压缩表。
- 可使用
myisampack
对 MyISAM 表进行压缩(也叫打包 pack)。 - 压缩表是不可修改的(除非先将表接触压缩,修改数据,在压缩)。
- 压缩表可极大的减少磁盘空间占用,因此也可以减少磁盘 I/O,以提升查询性能。
- 压缩表支持索引,但索引也仅只读。
- 现有的硬件能力,读取压缩表数据时的解压带来的开销影响并不大,减少 I/O 的好处则大的多。
- 压缩表中的记录时独立压缩的,因此读取单行不需要解压整个表(甚至不解压行所在的整个页面)。
性能
- MyISAM 引擎设计简单,数据以紧密格式存储,so 在某些场合性能很好。
- MyISAM 存在一些性能扩展限制。
- 如:对索引键缓冲区(key cache)的 Mutex 锁,MariaDB 基于段(segment)的索引建缓冲区机制可避免该问题。
- MyISAM 最典型的性能问题在于表锁,如长期发现处于 “Locked” 状态,则是表锁。