MyISAM为MySQL5.5之前版本默认存储引擎。一般的临时表和系统表都是MyISAM。这里的临时表是指:在排序,分组等操作中,当数量超过一定的大小之后,由查询优化器建立的临时表。
MyISAM存储引擎表由MYD(数据文件)和MYI(索引文件)组成。
当我们新建一张表指定MyISAM为存储引擎的时候,会有三个文件对应生成。myIsam.frm(用于记录表结构),myIsam.MYD,myIsam.MYI。
特性:
并发性与锁级别
是表级锁而不是行级锁,也就是说在对数据表进行修改的时候,需要对整个表进行加锁,对表进行读取时,需要对表进行加共享锁。表损坏修复
对与意外关闭进行修复,这里的修复不是事务修复,对表的修复可能造成数据的丢失。我们可以使用 check table tablename 进行表的检查,使用repair table tablename 进行表的修复。
下面我们看一下修复实例:
新建数据库
MySQL [test]> create table myIsam( id int ,c1 varchar(10))engine=myisam;
Query OK, 0 rows affected (0.04 sec)
在文件系统中查看生成的文件
[root@wangerxiao test]# pwd
/usr/local/mysql/var/test
[root@wangerxiao test]# ls -l myIsam*
-rw-r----- 1 mysql mysql 8582 Mar 14 19:22 myIsam.frm
-rw-r----- 1 mysql mysql 0 Mar 14 19:22 myIsam.MYD
-rw-r----- 1 mysql mysql 1024 Mar 14 19:22 myIsam.MYI
使用check 检查数据表
MySQL [test]> check table myIsam;
+-------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------+-------+----------+----------+
| test.myIsam | check | status | OK |
+-------------+-------+----------+----------+
1 row in set (0.04 sec)
使用repair修复数据表
MySQL [test]> repair table myIsam;
+-------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------+--------+----------+----------+
| test.myIsam | repair | status | OK |
+-------------+--------+----------+----------+
1 row in set (0.01 sec)
除了使用repair外,我们还可以使用命令行修复,不过要事先关闭mysql服务,否则会造成更多的数据丢失。
myisamchk --help
- MyISAM表支持的索引类型
支持全文索引 - MyISAM表支持数据压缩
命令: myisampack
由于表中的数据是独立进行压缩的,所以在读取单行数据的时候不必对整个表进行解压。
实例如何进行压缩:
进行压缩
[root@wangerxiao test]# myisampack -b -f myIsam.MYI
Compressing myIsam.MYD: (0 records)
- Calculating statistics
- Compressing file
Empty file saved in compressed format
压缩之前的文件为 .OLD
[root@wangerxiao test]# ls -lh myIsam*
-rw-r----- 1 mysql mysql 8.4K Mar 14 19:22 myIsam.frm
-rw-r----- 1 mysql mysql 50 Mar 14 19:28 myIsam.MYD
-rw-r----- 1 mysql mysql 1.0K Mar 14 19:38 myIsam.MYI
-rw-r----- 1 mysql mysql 0 Mar 14 19:28 myIsam.OLD
压缩之后,我们尝试插入数据表
MySQL [test]> insert into myIsam values(1,'aa');
ERROR 1036 (HY000): Table 'myIsam' is read only
提示错误,因为在压缩之后,数据表变成只读。
限制
如果在MySQL5.0之前的版本默认表大小为4G
如果想要存储大表则要修改 MAX_Rows 和 AVG_ROW_LEnGTH
两个参数相乘的大小,就是表可能达到的最大的大小
在5.0版本之后,单表支持256TB
适用场景
- 非事务型应用
- 只读类应用(支持压缩)
- 空间类应用(GPS数据)