MySQL的存储引擎之MylSAM

489 阅读5分钟

MylSAM存储引擎

在MySQL 5.1及之前的版本,MylSAM是默认的存储引擎。MylSAM提供了大量的特 性,包括全文索引、压缩、空间函数(GIS)等,但MylSAM不支持事务和行级锁,而 且有一个毫无疑问的缺陷就是崩溃后无法安全恢复。

正是由于MylSAM引擎的缘故,即 使MySQL支持事务已经很长时间了,在很多人的概念中MySQL还是非事务型的数据 库。尽管MylSAM引擎不支持事务、不支持崩溃后的安全恢复,但它绝不是一无是处 □£〉的。对于只读的数据,或者表比较小、可以忍受修复(repair)操作.,则依然可以继续使 用MylSAM(但请不要默认使用MylSAM,而是应当默认使用InnoDB)0存储

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

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

MylSAM特性

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

加锁与并发

MylSAM对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁, 写入时则对表加排他锁。但是在表有读取査询的同时,也可以往表中插入新的记录 (这被称为并发插入,CONCURRENT INSERT) o

修复

对于MylSAM表,MySQL可以手工或者自动执行检査和修复操作,但这里说的修 复和事务.恢复以及崩溃恢复是不同的概念。执行表的修复可能导致一些数据丢失, 而且修复操作是非常慢的。可以通过CHECK TABLE mytable检査表的错误,如果有 错误可以通过执行REPAIR TABLE mytable进行修复。另外,如果MySQL服务器已 经关闭,也可以通过myisamchk命令行工具进行检査和修复操作。

索引特性

对于MylSAM表,即使是BLOB和TEXT等长字段,也可以基于其前500个字符创建
索引。MylSAM也支持全文索引,这是一种基于分词创建的索引,可以支持复杂的 査询。关于索引的更多信息请参考第5章。

延迟更新索引键(Delayed Key Write) <jD 创建MylSAM表的时候,如果指定了 DELAY_KEY_WRITE选项,在每次修改执行完成 时,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区(in.memory key buffer),只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁 盘。这种方式可以极大地提升

写入性能,但是在数据库或者主机崩溃时会造成索引 损坏,需要执行修复操作。延迟更新索引键的特性,可以在全局设置,也可以为单 个表设置。

MylSAM压缩表

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

可以使用myisampack对MylSAM表进行压缩(也叫打包pack)o压缩表是不能进行修 改的(除非先将表解除压缩,修改数据,然后再次压缩)。压缩表可以极大地减少磁盘 空间占用,因此也可以减少磁盘I/O,从而提升査询性能。压缩表也支持索引,但索引 也是只读的。

以现在的硬件能力,对大多数应用场景,读取压缩表数据时的解压带来的开销影响并不 大,而减少I/O带来的好处则要大得多。压缩时表中的记录是独立压缩的,所以读取单 行的时候不需要去解压整个表(甚至也不解压行所在的整个页面)。

MylSAM性能

MylSAM引擎设计简单,数据以紧密格式存储,所以在某些场景下的性能很好。

MylSAM有一些服务器级别的性能扩展限制,比如对索引键缓冲区(key cache)的 Mutex锁,MariaDB基于段(segment)的索引键缓冲区机制来避免该问题。但MylSAM 最典型的性能问题还是表锁的问题,如果你发现所有的査询都长期处于“Locked”状态, 那么毫无疑问表锁就是罪魁祸首。 1.5.3 MySQL内建的其他存储引擎 MySQL还有一些有特殊用途的存储引擎。在新版本中,有些可能因为一些原因已经不 再支持;另外还有些会继续支持,但是需要明确地启用后才能使用。