我们先来看看MYISAM这种存储引擎,MYISAM存储引擎呢,是MYSQL5.5以及之前的版本,在MYSQL数据库默认的存储引擎,
由于这个原因呢,现在还有大量的服务器使用MYISAM的表,另外MyISAM也是MYSQL大部分系统表和临时表,所使用的一种
存储引擎,注意我这里所说的临时表,并不是我们create template所建的临时表,对于create template语句所见的表呢,
我们是可以使用各种存在MYSQL中的存储引擎的,而这里所说的临时表呢,是指在排序和分组等操作中,当数量操作一定的
大小之后,由查询优化器建立的磁盘临时表
MYISAM存储引擎会将表存储在两个系统文件中,一个是数据文件,以MYD为扩展名,另一个是索引文件,
以MYI为扩展名,我们先来看一下下一张表的定义,从左边的图中我们可以看到在这里我们定义了一个名为
myIsam的表,并且存储引擎还使用了myisam的存储引擎,右边就是文件系统中,myisam表的存储方式,这里我们可以看到,
有三个以myisam开头的文件,除了上面提到过的myd,myi两个文件之外呢,还有一个以frm为扩展名的文件,这个并不是
myisam所特有的一个文件,而对于MYSQL的所有存储引擎来说,都会有一个以frm为扩展名的文件,这个文件是用于记录
表的结构的,而MYD和MYI两个文件呢,是MYISAM所特有的一个文件
MYSQL最早使用的存储引擎之一,在极漫长的使用过程中呢,已经实现了很多自身的特性,以满足客户的需要,那我们就来
看一下MYISAM有哪些特性,所以我们知道了这些特性,我们才能明白,在什么情况下,我们应该使用MYISAM存储引擎,首先
MYISAM存储引擎的第一个特性就是,要从并发性和锁级别来看,MYISAM使用的是表级锁,而不是行级所,这个就意味着,只需要
在整个表进行加锁,而在表中的数据进行读取时呢,也需要对所有的表加共享锁,从这里我们就可以看到,使用MYISAM存储引擎的
表,读取和写入这两种是互斥的,当然在一些情况下呢,当我们对表中的数据进行读取时,也可以在表的末尾,插入数据,因此从
上面介绍呢,可以看出,MYISAM对于读写混合操作的并发性不会太好,如果只是只读操作的话,就并发性而言,性能还是可以接受的,
因为共享锁呢,并不会阻塞共享锁,他的第二个特性呢,从他的损坏修复来看,MYISAM支持由于任意以外关闭MYISAM表呢,检查和修复
操作,像这里所说的修复呢,像这里所说的修复呢,并不是事务恢复,MYISAM并不是事务型的存储引擎,所以也不可能进行事务恢复的
相关日志,所以要注意,对MYISAM进行修复,会造成数据的丢失,来对表进行检查,对于发现问题的表呢,可以使用repair table命令呢,
对其进行恢复,下面我们就来看看这两个命令是如何使用的
之前说过演示系统是基于MYSQL的一个实例,我们来到test库下,首先我们来建立一个myisam表,
他有简单的两个列,一个是id列,一个是c1列,这里要注意的话呢,如果想建立存储引擎的表,就要使用engine这个
参数来指定存储引擎,这里我们要建立的是myisam表,现在myisam表就已经建立好了,现在我们就来看看文件系统中,
myisam表是如何存储的
我们来到另一个连接下,来看一下myisam这个文件
ls -l myIsam*
大家可以看到,就如我们刚才开始说的,MYISAM表呢,在系统文件存储中呢,myisam文件来存储的,frm这个文件,
他存储的是这个表的结构信息,另外就是MYD文件,存储的是myisam表的数据信息,以及myi文件,存储的就是索引信息,
但我们现在回到第一个连接,check table这个命令,对于这个表会有什么样的效果,大家可以看到,当我们使用check
table对这个表进行检查的时候呢,他的message显示的是ok状态,说明这张表是没有任何问题的,如果我们使用repair table
呢,同样由于我们这张表没有损坏,repair table也会返回ok的命令,如果有损坏的myisam表的话,就可以使用repair table命令呢,
进行修复,另外呢,要注意,repair table对表进行修复的话
mysql还提供了一个命令行的工具,myisamchk --help,这个工具也可以对myisam表进行修复
也可以对myisam表进行修复,有一点大家要注意,如果使用命令行工具对myisam表进行修复的话,则需要咱Mysql服务
停止,在mysql服务运行的同时,如果使用命令行工具对表进行修复,可能使表造成更加大的损坏,这一点大家一定要注意,
这里我就介绍好了Myisam表一些特点,以及如果损坏如何对他进行修复,下面我们来看一下myisam表还有哪些特性,首先来
看看Myisam表所支持的索引,myisam表支持全文索引,并且在mysql5.7之前版本唯一原生就支持全文索引的官方引擎,另外,
myisam还支持text和blob的前缀索引,如果myisam是一张很大的只读表的话,也就是在表创建完,进行导入数据后,就不会对表
进行任何修改操作了,那么我们就可以对这种表进行压缩操作,这样就可以减少磁盘IO,所以说,myisam表是支持磁盘IO的,
如果要对一张表进行压缩呢,我们可以使用myisampack命令,来压缩表中的数据,由于表中的数据是独立进行压缩的,读取单行数据
的时候呢,不必对整个表进行解压
来演示一下如何对整张表进行压缩,我们刚才哪张表实际上并不大,一张刚创建的新表,所以如果我们想要使用
myisampack命令进行压缩的话,我们需要指定一个-f参数,强制来对他进行压缩,然后我们要指定对这个表的MYI命令,
我们接下来看一下效果,返回了说这实际上是一个很小的文件,他只有一条记录,空文件形成了一个压缩格式
因为我们这张表太小,所以在默认情况下,是不能对这张表进行压缩的,所以我们使用-f参数来强制对其进行压缩,
所以呢我们会看到,实际压缩之后的文件,比我们压缩前的文件还要大,myisam.old这个文件,是之前文件的一个备份,
我们压缩后的文件不但没有变小,反而呢变大了,这是因为我们原来的文件太小了,他只有一行记录,所以完全没有必要
进行压缩,这里只是演示了压缩命令是如何使用的,下面我们就来看一下对已经压缩的表,如果我们要进行读写操作,会有
什么样的情况发生
我们回到另一个连接,现在咱们的myisam表一已经被压缩了,这个时候我们对myisam进行插入操作,看到这里会
返回一个提示,myisam是一个只读的表,所以对已压缩的表呢,不能进行写操作的,只能进行读操作
这里大致的介绍了一下MYISAM存储引擎特性,如果大家对特性还是感兴趣的话,可以看一下myisam的相关手册,
来决定是否要使用myisam存储引擎了,下面我们来看一下myisam存储引擎的一些限制,来看看使用myisam表时呢,
有什么样的限制,在使用myisam表时,有一点需要注意,就是在mysql5.0之前的版本,myisam表单表最大的文件呢,
4个G,如果我们想在单个表存储超过4个G的,需要在建表的时候,通过指定max_rows和平均行长度,这两个参数来实现,
这两个参数相乘的大小就是表能达到的最大的大小,对于大表来说,修改这两个参数会导致重建,所以呢,会需要一些
时间,如果大家还在使用MYSQL5.0之前的服务的话呢,还是建议大家升级到最新版本的MYSQL的服务器,而对于单表最大
4G的限制,MYSQL5.0版本之后呢,就没有了,在MYSQL5.0版本之后呢,单表就变成了256个TB,这就足够我们使用了,这里呢我们
就已经完全了解了,myisam存储引擎的限制和特性,那么根据我们这些内容呢,我们就可以很容易的知道,myisam适合在什么样的
场景下使用了
所以我们就看看myisam的适用场景,首先第一个适用场景呢,是非事务型应用,myisam首先呢,是一种非事务型的
存储引擎,就是说,myisam是不支持事务的,前面给大家介绍了什么叫做事务,以及事务的一些ACID特性,并且也说过,
关系型数据库,与其他应用最大的区别呢,是关系型数据库是支持事务的,那这里也说明不支持事务的存储引擎,那这里是不是
有一些矛盾呢,虽然Myisam不支持事务,但是mysql其他支持事务的存储引擎呢,InnoDB,所以mysql还是一种支持事务的数据库,
而对于Myisam不支持事务的存储引擎呢,也有其适应的场景,首先来说,首先是不是都需要事务呢,我想对于ORACLE应用,比如数据
仓库,报表,还有大多数不涉及财务的应用,不需要事务管理性的,那在这样的应用场景中呢,就可以使用myisam这种存储引擎的,
由于myisam可以对表进行压缩,所以对于只读的报表的应用呢,是非常合适的,所以myisam另外一个应用场景呢,只读类的应用,
前面提到了myisam支持对数据文件的压缩,而且虽然在读取数据时,就加共享锁,共享锁是不会进行阻塞的,对于只读的应用来说,
myisam的io和并发性能还是不错的,所以也只有在只读这种应用中呢,可以使用Myisam存储引擎的,myisam这种表的第三种使用场景呢,
空间类的一些以应用,在MYSQL5.7之前,MYISAM是唯一支持空间函数的存储引擎,所以我们想在MYSQL中存储空间类的数据,如GPS数据,
并且利用空间函数,对所存储的数据进行运算的话,咱们就只能用myisam存储引擎了,除了以上三种类型的应用之外,其他的是不太建议
大家使用myisam存储了,大多数情况下使用InnoDB存储引擎,更适合我们的应用场景,下面我们就使用InnoDB存储引擎的特点