本来这篇文档只想写Myisam和Innodb两个存储引擎的区别,毕竟这个话题也是面试中经常被问到的。但,Myisam存储引擎由于不支持事务以及不支持行级锁,用的人越来越少了。所以,干脆写一写MySQL常见的引擎吧。
什么是MySQL存储引擎
所谓存储,就是存数据的介质,而存储引擎就是一种存储数据的方式,就好比磁盘里的文件系统。不同的存储引擎,存储数据的方式不同,实现的功能点也不同。MySQL8.0默认的存储引擎为Innodb。
MySQL存储引擎都有哪些
在MySQL8里,可以执行show engines;来查看所有支持的存储引擎。
查看某个表是什么存储引擎:
不同的存储引擎都有各自的特点,以适应不同的需求,我只针对下面3个常见的存储引擎做出对比,如下表所示:
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处理的方式都一样。
审核编辑:刘清
-
SAM
+关注
关注
0文章
112浏览量
33499 -
MySQL
+关注
关注
1文章
801浏览量
26438 -
Hash
+关注
关注
0文章
32浏览量
13188 -
MVCC
+关注
关注
0文章
13浏览量
1461
原文标题:来聊聊MySQL的存储引擎
文章出处:【微信号:aming_linux,微信公众号:阿铭linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论