MySQL MyISAM存储引擎简介(新手必看)
MyISAM 存储引擎在 MySQL 数据引擎中起源最早,MyISAM 的最初版本是 ISAM,最初的 MySQL 架构比较混乱,数据业务和数据存储没有很好地分离出来,MySQL 意识到需要更改架构,将前端的业务逻辑和后端数据存储以清晰的层次结构拆分开,于是 ISAM 被重构成 MyISAM,此时 MySQL 从架构上来讲真正实现了逻辑业务和数据存储的分离。
.frm 文件和 .MYI 文件可以放在不同的目录下面,平均分配读取权限,可以获得更快的速度。MyISAM 存储引擎不支持事务,也不支持主键,对数据的存储和批量查询的速度比较快。
在实际应用中,对于不需要完整事务、主要以查询和增加记录为主的应用,往往采用 MyISAM 存储引擎。MyISAM 存储引擎只缓存索引,对数据文件采用操作系统缓存,如果索引数据超过系统所分配的缓存空间时候,也会采用操作系统来缓存索引。
另外,还可以使用 myisamchk 工具修复损坏的表。通过 myisamchk 可以检测 MyISAM 类型表的健康状态和修复甚至优化表的存储。
在 Linux 平台下,使用 myisamchk 检测某个表的时候,如果有用户同时也在操作这张表,即便这张表没有问题,也很有可能会提示该表已经被损坏,所以在检测数据库表的时候,应当停止 mysqld 服务。如果不想停掉 mysqld 服务,至少应该做一个 mysqladmin flush–tables 操作。
使用
例如以下示例演示 myisamchk 操作:
myisamchk 命令中 -O var=option 这个参数可以用来设置一些变量,-O 选项可能的变量如下:
当在很大文件上运行 myisamchk 时候,往往需要较大的内存,缺省使用 3M 来修复。可以通过如下命令来设置内存空间:
其中静态和动态表数据存储根据其表中数据列的类型自动选择,静态表是默认的存储格式,压缩表则只能通过 myisampack 工具创建。
静态表中的字段都是固定非变长的字段,这样每个记录都是固定长度的,这种存储方式的优势在于存储速度非常快,容易缓存,表发生缺损后容易恢复,缺点是静态表所占用的空间往往要比动态表多。
MyISAM 存储引擎采用动态表将会支持动态可变长度,字符型的列长是可变的,除了小于 4 个字符的。动态可变长字符通常比静态固定格式需要更少的存储空间,由于采用动态可变长度存储,所以出错的时候也比静态格式恢复更加困难,因为行变化如果很大的话,会被分成碎片。这个时候可以使用 myisamchk –ei 获取表的统计信息,并使用 myisamchk –r 来进行修复。
MyISAM 存储压缩表需要的磁盘存储空间最小,数据库系统提供了 myisampack 工具可以用来压缩 MyISAM 表,每行单独压缩,每列的压缩也不一样。
MySQL MyISAM文件格式
MyISAM 在磁盘上存储三个文件,文件名和对应的表名是一致的:- .frm 文件:存储表的定义数据;
- .MYD 文件:存储表具体记录数据;
- .MYI 文件:存储索引。
.frm 文件和 .MYI 文件可以放在不同的目录下面,平均分配读取权限,可以获得更快的速度。MyISAM 存储引擎不支持事务,也不支持主键,对数据的存储和批量查询的速度比较快。
在实际应用中,对于不需要完整事务、主要以查询和增加记录为主的应用,往往采用 MyISAM 存储引擎。MyISAM 存储引擎只缓存索引,对数据文件采用操作系统缓存,如果索引数据超过系统所分配的缓存空间时候,也会采用操作系统来缓存索引。
MySQL MyISAM文件修复
MyISAM 类型的表在数据存储的过程中可能会发生错误,此时可以通过使用 CHECK TABLE 语句检测 MyISAM 表的状态,然后用 REPAIR TABLE 语句修复损坏的表。另外,还可以使用 myisamchk 工具修复损坏的表。通过 myisamchk 可以检测 MyISAM 类型表的健康状态和修复甚至优化表的存储。
在 Linux 平台下,使用 myisamchk 检测某个表的时候,如果有用户同时也在操作这张表,即便这张表没有问题,也很有可能会提示该表已经被损坏,所以在检测数据库表的时候,应当停止 mysqld 服务。如果不想停掉 mysqld 服务,至少应该做一个 mysqladmin flush–tables 操作。
使用
myisamchk --help
命令可以获取 myisamchk 的用法,myisamchk 的命令格式如下:
myisamchk [options] tables[.MYI]其中
[options]
用于指定 myisamchk 的操作,具体可选的参数含义如下:
- -c:表示用来检测表可能存在的错误;
- -d:表示打印出表的一些信息;
- -e:表示彻底地检查表;
- -i:表示打印有关被检查表的信息统计;
- -k #:一般与参数 -r 一起使用,表示仅仅更新头 # 个索引,较高编号的索引被撤销。撤销的索引会通过 myisamchk –r 被重新激活;
- -q:与 -r 一起可以使得修复速度更快;
- -r:表示可以修复几乎所有的损坏的问题;
- -o:相比 -r 而言,-o 恢复表的能力要慢一些,但是能处理一些 -r 不能处理的情况;
- -u:解开一个用 myisampack 压缩的表;
- -w:表示如果表被锁定,将会发生等待。
例如以下示例演示 myisamchk 操作:
[root@localhost books]# ls books.frm books.MYD books.MYI db.opt [root@localhost books]# myisamchk -e books.MYI Checking MyISAM file: books.MYI Data records: 0 Deleted blocks: 0 - check file-size - check record delete-chain - check key delete-chain - check index reference - check data record references index: 1 - check record links
myisamchk 命令中 -O var=option 这个参数可以用来设置一些变量,-O 选项可能的变量如下:
key_buffer_size 20971520 key_cache_block_size 1024 myisam_block_size 1024 read_buffer_size 2097152 write_buffer_size 2097152 sort_buffer_size 20971520
当在很大文件上运行 myisamchk 时候,往往需要较大的内存,缺省使用 3M 来修复。可以通过如下命令来设置内存空间:
[root@localhost books]# myisamchk -O sort_key_blocks=16 -e books.MYI Checking MyISAM file: books.MYI Data records: 0 Deleted blocks: 0 - check file-size - check record delete-chain - check key delete-chain - check index reference - check data record references index: 1 - check records and index references
MySQL MyISAM表的存储格式
MyISAM 类型的表支持三种不同存储类型格式的表,分别如下:- 静态(固定长度)表;
- 动态(可变长度)表;
- 压缩表。
其中静态和动态表数据存储根据其表中数据列的类型自动选择,静态表是默认的存储格式,压缩表则只能通过 myisampack 工具创建。
静态表中的字段都是固定非变长的字段,这样每个记录都是固定长度的,这种存储方式的优势在于存储速度非常快,容易缓存,表发生缺损后容易恢复,缺点是静态表所占用的空间往往要比动态表多。
MyISAM 存储引擎采用动态表将会支持动态可变长度,字符型的列长是可变的,除了小于 4 个字符的。动态可变长字符通常比静态固定格式需要更少的存储空间,由于采用动态可变长度存储,所以出错的时候也比静态格式恢复更加困难,因为行变化如果很大的话,会被分成碎片。这个时候可以使用 myisamchk –ei 获取表的统计信息,并使用 myisamchk –r 来进行修复。
MyISAM 存储压缩表需要的磁盘存储空间最小,数据库系统提供了 myisampack 工具可以用来压缩 MyISAM 表,每行单独压缩,每列的压缩也不一样。