前言

  • 在 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_ROWSAVG_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” 状态,则是表锁。