MySQL 存储引擎介绍(MyISAM 存储引擎)

  • A+
所属分类:MySQL

MySQL 5.1 以及之前的版本,MyISAM 是默认的存储引擎。MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但 MyISAM 不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。正是由于 MyISAM 引擎的缘故,即使 MySQL 支持事务已经很长时间了,在很多人的概念中 MySQL 还是非事务型的数据库。尽管 MyISAM 不支持事务、不支持崩溃后的安全恢复,但它绝不是一无是处的。对于只读的数据,或者表比较小,可以忍受 repair (修复)操作,则依然可以继续使用 MyISAM (但是请不要默认使用 MyISAM ,而是应当默认使用 InnoDB)。

存储

MyISAM 会将表存储在两个文件中:数据文件和索引文件,分别会以 .MYD 和 .MYI 为扩展名。MyISAM 表可以包含动态或者静态行。 MySQL 会根据表的定义来决定采用何种格式。 MyISAM 表可以存储的行记录数,一般受限于可用的磁盘空间,或者操作系统中单个文件的最大尺寸。

在 MySQL 5.0 中,MyISAM 表如果是变长行,则默认配置只能处理 256TB 的数据,因为指向数据记录的指证长度是 6 个字节。而在更早的 MySQL 版本中,指针的默认长度都支持 8 字节的指针。要改变 MyISAM 表指针的长度,可以通过修改表的 MAX_ROWS 和 AVG_ROW_LENGTH 选项的值来实现,两者相乘就是表可能达到的最大大小。修改这两个参数会导致重建整个表和表的所有索引,这可能要很长的时间才能完成。

MyISAM 特性

作为 MySQL 最早的存储引擎之一,MyISAM 有一些已经开发出来很多年的特性,可以满足用户的实际需求。

加锁与并发

MyISAM 对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对表添加排它锁。但是在表有读取查询时, 也可以往表中插入新的记录。

修复

对于 MyISAM 表,MySQL 可以手工或者自动执行检查和修复操作,但这里说的修复和事务修复以及崩溃修复是不同的概念。执行表的修复可能会丢失一部分数据,而且修复操作是非常慢的。

索引特性

对于 MyISAM 表,即使是 BLOB 和 TEXT 等长字段,也可以基于其前 500 个字符创建索引。MyISAM 也支持全文索引,这是一种基于分词创建的索引,可以支持复制的查询。

延迟更新索引键

创建 MyISAM 表的时候,如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区(in_memory key buffer),只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁盘。这种方式可以极大地提升性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。延迟更新索引键的特性,可以在全局设置,也可以为单个表设置。

MyISAM 压缩表

如果表在创建并导入数据以后,不会在进行修改操作,那么这样的表或者适合采用 MyISAM 压缩表。

可以使用 myisampack 对 MyISAM 表进行压缩。压缩表是不能进行修改的。压缩表可以极大地减少磁盘空间占用,因此也可以减少磁盘 I/O,从而提升查询性能。压缩表也支持索引,但索引也是只读的。

MyISAM 性能

MyISAM 引擎设计十分简单,数据以紧密格式存储,所以在某些场景下的性能很好。MyISAM 有一些服务器级别的性能扩展限制。但是 MyISAM 最典型的的性能问题还是 表锁的问题。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: