MySQL常用存储引擎之MyISAM

我们先来看看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存储引擎的特点

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值