写一写MySQL常见的引擎

描述

本来这篇文档只想写Myisam和Innodb两个存储引擎的区别,毕竟这个话题也是面试中经常被问到的。但,Myisam存储引擎由于不支持事务以及不支持行级锁,用的人越来越少了。所以,干脆写一写MySQL常见的引擎吧。

什么是MySQL存储引擎

所谓存储,就是存数据的介质,而存储引擎就是一种存储数据的方式,就好比磁盘里的文件系统。不同的存储引擎,存储数据的方式不同,实现的功能点也不同。MySQL8.0默认的存储引擎为Innodb。

MySQL存储引擎都有哪些

在MySQL8里,可以执行show engines;来查看所有支持的存储引擎。

SAM

查看某个表是什么存储引擎:

SAM

不同的存储引擎都有各自的特点,以适应不同的需求,我只针对下面3个常见的存储引擎做出对比,如下表所示:

SAM

MyISAM存储引擎

在MySQL5.5之前的版本,默认使用该存储引擎。若使用该存储引擎,每个表会在磁盘上存储成三个文件:

frm文件:存储表的定义数据

MYD文件:存放表具体记录的数据

MYI文件:存储索引

Frm和MYI可以存放在不同的目录下。MYI文件用来存储索引,但仅保存记录所在页的指针,索引的结构是B+树结构。

支持数据的类型也有三种:

1)静态固定长度表

这种方式的优点在于存储速度非常快,容易发生缓存,而且表发生损坏后也容易修复。缺点是占空间。这也是默认的存储格式。

2)动态可变长表

优点是节省空间,但是一旦出错恢复起来比较麻烦。

3)压缩表

上面说到支持数据压缩,说明肯定也支持这个格式。在数据文件发生错误时候,可以使用check table工具来检查,而且还可以使用repair table工具来恢复。

MyISAM存储引擎有一个重要的特点那就是不支持事务,但是这也意味着它的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。

InnoDB存储引擎

InnoDB是MySQL8.0版本默认的数据库存储引擎,他的主要特点有:

可以通过自动增长列,方法是auto_increment。

支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。

使用的锁粒度为行级锁,可以支持更高的并发;

支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。

配合一些热备工具可以支持在线热备份;

在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;

对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;

当然InnoDB的存储表和索引也有下面两种形式:

使用共享表空间存储:所有的表和索引存放在同一个表空间中。

使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。

对于InnoDB来说,最大的特点在于支持事务。但是这是以损失效率来换取的。

Memory存储引擎

将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm。Memroy存储引擎主要有以下特点:

支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;

由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;

查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;

默认使用hash索引。

如果一个内部表很大,会转化为磁盘表。

MyISAM对比Innodb

再来做一个总结吧,面试中被问到,可以简单说说下面几个要点:

存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB

存储空间

MyISAM支持支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。当表在创建之后并导入数据之后,不会再进行修改操作,可以使用压缩表,极大的减少磁盘的空间占用。
InnoDB需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用mysqldump,在数据量达到几十G的时候就相对痛苦了。

事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持、外部键等高级数据库功能。

是否支持行级锁

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是Innodb的最大特色。行锁大幅度提高了多用户并发操作的性能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

是否支持聚集索引

MyISAM不支持聚集索引,InnoDB支持聚集索引。

外键

MyISAM:不支持
InnoDB:支持

全文索引

MyISAM支持 FULLTEXT类型的全文索引。
InnoDB不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

表主键

MyISAM允许没有任何索引和主键的表存在,索引都是保存行的地址。
对于InnoDB,如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见)。

表的行数

MyISAM保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB没有保存表的总行数,如果使用select count() from table;就会遍历整个表,消耗相当大,但是在加了where条件后,MyISAM和InnoDB处理的方式都一样。





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分