首页 > 编程笔记 > MySQL笔记 阅读:10

MySQL MyISAM存储引擎简介(新手必看)

MyISAM 存储引擎在 MySQL 数据引擎中起源最早,MyISAM 的最初版本是 ISAM,最初的 MySQL 架构比较混乱,数据业务和数据存储没有很好地分离出来,MySQL 意识到需要更改架构,将前端的业务逻辑和后端数据存储以清晰的层次结构拆分开,于是 ISAM 被重构成 MyISAM,此时 MySQL 从架构上来讲真正实现了逻辑业务和数据存储的分离。

MySQL MyISAM文件格式

MyISAM 在磁盘上存储三个文件,文件名和对应的表名是一致的:
.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 的操作,具体可选的参数含义如下:
例如以下示例演示 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 类型的表支持三种不同存储类型格式的表,分别如下:
  1. 静态(固定长度)表;
  2. 动态(可变长度)表;
  3. 压缩表。

其中静态和动态表数据存储根据其表中数据列的类型自动选择,静态表是默认的存储格式,压缩表则只能通过 myisampack 工具创建。

静态表中的字段都是固定非变长的字段,这样每个记录都是固定长度的,这种存储方式的优势在于存储速度非常快,容易缓存,表发生缺损后容易恢复,缺点是静态表所占用的空间往往要比动态表多。

MyISAM 存储引擎采用动态表将会支持动态可变长度,字符型的列长是可变的,除了小于 4 个字符的。动态可变长字符通常比静态固定格式需要更少的存储空间,由于采用动态可变长度存储,所以出错的时候也比静态格式恢复更加困难,因为行变化如果很大的话,会被分成碎片。这个时候可以使用 myisamchk –ei 获取表的统计信息,并使用 myisamchk –r 来进行修复。

MyISAM 存储压缩表需要的磁盘存储空间最小,数据库系统提供了 myisampack 工具可以用来压缩 MyISAM 表,每行单独压缩,每列的压缩也不一样。

相关文章