漫谈MySQL存储引擎的特点与使用

前言

MySQL数据库本身拥有众多的存储引擎,但是到底存储引擎有什么样的作用呢,为什么要有那么多的存储引擎呢?

存储引擎到底是什么?

简单的说,不同的存储引擎就是应用了不同的技术,技术的侧重点就是从磁盘或者是内存中读写数据。有的引擎读数据快,有的引擎写数据快。

当然除了这句非常简单的解释外,不同的存储机制还是提供了非常广泛的功能和能力的。如众所周知的InnoDB引擎的事物能力。

不同的存储引擎对应用场景都有不同的帮助,所以究竟使用哪个存储引擎更为合适,只能取决于表设计的应用场景。所以,在了解每一种存储引擎的特点后,才能够在设计表时结合业务场景,选取最为合适的存储引擎。

存储引擎又有叫做表类型的,因为MySQL中数据的存储是以表的方式来进行存储的,如何写入数据、更新数据、查询数据、建立索引等等操作都是在表的基础上进行操作的。所以存储引擎又可以理解为存储和操作此表的类型,又称之为表类型。

在MySQL中不同的表是可以拥有不同的存储引擎的。

我的MySQL到底支持哪些引擎?

不同的MySQL版本,其实支持了不同的存储引擎,在技术发展到今天,已经支持了很多的存储引擎了,那么首先我们先看看自己的数据库支持什么样的存储引擎。

首先查询数据库版本

selectVERSION();

我的数据库版本是

使用下面语句获得数据库支持的引擎

showengines;

运行结果

图1

图1中,可以看到,我这个版本的数据库,查询返回结果9中,支持8种引擎,其中InnoDB为默认存储引擎。

MyISAM

CSV

MRG_MYISAM

BLACKHOLE

MEMORY

PERFORMANCE_SCHEMA

ARCHIVE

InnoDB

FEDERATED

查看表的存储引擎

语句:

showcreatetable表名;

结果

MyISAM引擎

从图1中的Transactions列的值可以看到MyISAM引擎是不支持事务的,所以当我们的应用场景中需要有事务操作的时候,不适合选中这种存储引擎。

这个引擎的最大特点就是读取速度快。

在MyISAM中,假如我们创建了一个表,表名叫mytable,那么会随之而创建三个文件。

文件名字分别是:

mytable.frm,存储表定义;

mytable.MYD,存储表数据;

mytable.MYI,存储表索引。

由于MyISAM的这种存储结构,在进行数据的备份、迁移、恢复等操作时,非常的容易。只要对文件进行操作就可以。

MyISAM只支持表锁,没有行锁。我理解的,其实就是相当于把文件锁住了。

MyISAM不支持事务安全,但每次读的操作是具有原子性的,所以不必担心脏读等情况。

综上,当你的业务场景中,对于表的操作,读的操作远远大于写,并且没有事务要求时,MyISAM引擎就是一个非常不错的选择。

InnoDB引擎

InnoDB是MySQL5.5之后默认的存储引擎,并且现在在互联网公司,基本上都是采用的这种存储引擎。因为它的事务、它的健壮。接下来看一下,InnoDB还有哪些特点。

支持事务、回滚、崩溃修复,所以对数据安全性较高的业务场景都选择了这个引擎。

支持行级锁,行级锁的支持大大提高了数据库的并发操作能力,但需要注意的是,行级锁只有在where条件中,主键是有效的行级锁才会生效,否则不生效。原因是主键有效,此时能够确定扫描范围,而主键无效则确认不了扫描范围,为了保证不发生脏读等情况,所以锁全表。

支持外键约束,在MySQL中,只有InnoDB支持外键,在范式设计的原则下,外键约束保证了数据的完整性。

关于可移植性、备份、恢复数据等情况,InnoDB可以采用binlog、mysqldump方式来进行操作。其中binlog是记录了MySQL所有的insert、update和delete的操作,相当于重新放映了一遍MySQL的操作。

关于可移植性、备份、恢复数据等情况时,要操作几十G以上的表时,InnoDB引擎会比较痛苦。主要受存储方式限制。

关于存储方式,InnoDB可以使用共享表空间的存储方式,也可以选择单独表空间的存储方式。

在选择共享表空间的存储方式时,InnoDB所有的数据都保存在一个单独的表空间里,这个表空间可以由很多个文件组成,而一个表中的数据又可以横跨多个文件存在。在表空间中,不仅仅存储了表中数据,还存储了关于这个表的索引等其他数据。这个时候,数据存储的大小限制不再是文件大小的限制,而是起空间本身大小的限制。

在选择单独共享表空间的存储方式时,每个表的数据以一个单独的文件来存放,这个时候的单表限制,就成为了系统中的文件系统对文件大小的限制。

参数innodb_file_per_table设置选择共享表空间和单独表空间。值为1开启单独表空间,否则开启共享表空间。

CSV引擎

CSV引擎的数据存储格式就是csv文件,这个文件格式我们都非常的熟悉了,这种格式非常的普遍,用Excel都可以直接打开。

这种引擎我们用的非常少,一般来说只有想要产出通用报表的时候才会用,不过一般我们在做数据的时候,也会通过ETL过程来处理加工数据后,再产出报表。基本不会直接用这种引擎。

MRG_MYISAM引擎

这个引擎的全称时MERGE_MYISAM,就是把MyISAM表合并到一起。

这些MyISAM表必须结构完全相同。MERGE_MYISAM表是一个合集,可以把它想象成为一个仓库,仓库里边装的都是MyISAM表,我们在做CRUD操作时,也是针对内部的MyISAM表进行的。

MERGE_MYISAM引擎,就叫它合并引擎吧。

在实际项目中,当我们的单表数据量很大的时候,很多时候我们会想到水平拆分表,相当于把一个表拆成多个,但是表的结构不变,但这样拆分之后,我们的查询语句就会变的比较复杂。这个时候就可以用到MERGE_MYISAM表,好处时创建MERGE_MYISAM表后,我们就可以只写一个查询语句,就可以搞定多个表的查询结果了。

MERGE_MYISAM表的创建和删除,对内部的MYISAM表没有任何的影响,所以可以放心的去做。

BLACKHOLE引擎

直译为黑洞引擎,blackhole翻译过来就是黑洞。

这种引擎写入的任何数据都会消失,这种引擎在实际项目中应用的应用的也非常的少。除非有特殊场景,一般不会选用这种引擎。可以作为日志等不是很重要数据的中继服务器

MEMORY引擎

从名字上可以看出,这是一个以内存作为存储方式的存储引擎。

内存作为数据存储空间的优点就是快。

缺点也比较明显,当mysql数据库出现问题时数据都会丢失。还有一点需要注意,MEMORY引擎要求存储到数据表里的字段类型需要是长度不变的,可变类型不行,比如text这种是不可以存储的。

所以:

当我们的数据丢失后,并不会对系统造成致命伤害时

当我们的数据比较小,并且被频繁操作时,其实就现在的内存大小来说,数据不小也可以

当数据为临时数据时

......

总之数据丢失不重要,我觉得都可以尝试使用MEMORY引擎,但如果很长时间不访问,就不要用了,毕竟还是占内存的。

PERFORMANCE_SCHEMA引擎

可以翻译成为性能图解引擎,或者是性能概要引擎。主要是用于收集数据库性能参数的一种引擎。

提供的功能:

进程信息

锁信息

互斥变量

文件信息

历史时间汇总

......

可以为提供MySQL服务器性能做出详细判断。

ARCHIVE引擎

归档引擎,应用的不多。

这种引擎的优点就是拥有较好的数据压缩机制,但其不支持那么多的特性,5.5之后支持索引,在5.5之前只支持输入写入和查询。

当你的磁盘空间有限,并且数据并不经常使用,可以采用归档引擎。从名字上其实就可以看出,ARCHIVE的中文翻译就是档案,把数据存档,就是保留数据使用的。

赞赏

长按







































鍒濇湡鐧界櫆椋庤兘涓嶈兘娌诲ソ
鍖椾含娌荤枟鐧界櫆椋庡摢闂村尰闄㈡瘮杈冨ソ



转载请注明:http://www.xcqg58.com/jbjj/jbjj/6805.html