MyISAM存储引擎
每张表在磁盘上的存储分为三个文件:存放元数据的.frm文件,存放表记录数据的.MYD文件,存放索引数据的.MYI为索引文件。
MyISAM的一些特点
·只对索引进行缓存(Key Cache),数据文件使用操作系统cache,当索引数据大于分配的key buffer时也使用操作系统cache索引
·单独保存表的行数,因此做count(*)时不需要全表扫描
·不是事务安全的,不支持外键
·表级锁定
·每张表一个数据文件,备份时可以直接复制,恢复时也可以直接覆盖,操作方便
·使用myisamchk进行故障恢复
MyISAM启动
以下为启动选项
--myisam-recover-option=mode
设置MyISAM表损坏后自动恢复的模式
--delay-key-write=ALL
不在MyISAM表写操作之间刷新key cache
key_buffer_size
Key cache的大小
以下系统变量影响MyISAM表
bulk_insert_buffer_size
用于优化批量插入操作的树缓冲区大小
myisam_max_sort_file_size
MySQL在重建MyISAM索引时(REPAIR TABLE、ALTER TABLE、LOAD DATA INFILE)可以使用的临时文件最大容量。如果需要的文件大小超过此值,索引会在key cache中创建,相比而言速度较慢
myisam_sort_buffer_size
设置用于表恢复的缓冲区大小
MyISAM表的存储格式
MyISAM支持三种不同的存储格式:静态固定长度、动态可变长度和压缩格式。前两者根据列的数据类型自动选择。压缩格式只能通过myisampack工具创建。
当使用CREATE TABLE或ALTERTABLE操作不包含BLOB、TEXT列时,ROW_FORMAT选项强制设置存储格式(FIXED、DYNAMIC)。
静态固定长度:
·CHAR和VARCHAR自动用空格填充,BINARY和VARBINARY以0x00填充。
·快速,因为数据文件中的行可以用简单的方法找到:用行长度乘以行号。
·容易缓存
·崩溃后容易重建,因为行的位置固定。
·不需要重新组织,除非删除了大量的记录,想为操作系统腾出磁盘空间。可以使用OPTIMIZE TABLE或myisamchk-r完成。
·通常比动态格式花费更多的空间。
动态可变长度:
·字符型的列长度可变,除了长度小于4的
·每行首部存在一个位图,用于记录哪些列包含空字符串(对于字符型)或0(对于数字型)。注意这里不包括NULL。空串和0为被标记在位图中而不存储在磁盘。非空字符串保存它的长度和实际内容(即保存实际长度+1)。
·通常比静态固定格式花费较少的空间。
·如果行变的很大,会对它进行分片,导致行碎片。OPTIMIZE TABLE或myisamchk-r可以用来改善性能。myisamchk -ei获取表的统计信息。
·崩溃时比静态格式的恢复困难,因为行可能被分为碎片而碎片的链接也可能失效。
压缩表:
·花费非常少的磁盘空间,这对于低速存储器(如CD-ROMs)很有帮助。
·每行单独地压缩,因此访问开销小。根据行的大小,每行的头部占1到3个字节不等。
·每列压缩也不同,通常每列都具有不同的哈夫曼树,以下为一些常见的压缩类型:
1、后缀空格压缩
2、前缀空格压缩
3、0值用1位(bit)来存储
4、整型数值如果都分布在一小范围中,则该列存储使用更小的类型。比如BIGINT(8字节)列中的值都分布在-128至127内,可以TINYINT(1字节)存储。
5、列只有某几种可能的值,转换为ENUM类型
6、以上各种压缩类型都可任意结合
·可以处理固定长度或动态长度记录
MyISAM表的问题
当以下事件发生时,可能导致表损坏:
·mysqld进程在写过程中被kill
·不可意料的主机Crash
·硬件故障
·当服务器正在修改表时,使用外部程序(如myisamchk)修改表
·MySQL或MyISAM代码存在的Bug
不正确的关闭表:
每个MyISAM索引文件(.MYI)在首部有一个计数器用来验证表是否正确关闭。当使用CHECK TABLE或myisamchk出现以下提示时表明计数器目前不同步:
clients are using or haven'tclosed the table properly