MySQL存储引擎之MyISAM

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数据)

你可能感兴趣的:(MySQL存储引擎之MyISAM)