MySQL之存储引擎

146 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

前言

说到MySQL存储引擎,想必大部分人都会说InnoDB,MyISAM,尤其是InnoDB就我个人开发工作中基本上就是这个引擎了,说实话MyISAM都没用过,很重要的一点是InnoDB是支持事务的!当然MySQL除了这两个引擎外还有一些其他的引擎,比如CSV,MEMORY等等,只不过我们平常基本上都不怎么使用的,本文也主要是介绍InnoDB,MyISAM两个引擎的区别。

首先查看当前MySQL版本,因为不同版本下会有些区别,执行select version();查看版本,如下图可以看到当前介绍是基于MySQL5.7版本的。

image.png

1.查看MySQL有哪些引擎

执行命令:show engines;如下图,可以看到MySQL默认是InnoDB引擎,并且InnoDB是支持事务和分布式事务的。

image.png

如果默认是InnoDB引擎那么我们新建个表看下是不是,如下图,新建员工test表,使用命令:show create table table_name;查看当前表的存储引擎。

image.png

我们修改下表的存储引擎为MyISAM,使用命令alter table test engine = MyISAM;,如下图,然后使用,命令查看修改后的存储引擎。

image.png

2.InnoDB

下面来介绍下InnoDB引擎:

1.MySQL从3.23.34a开始就包含InnoDB存储引擎。 大于等于5.5之后,默认采用InnoDB引擎 。也就是说在MySQL5.5之前MyISAM的热度还是高于InnoDB的,其实也可以想象,以前的业务使用事务的场景也没那么多。

2.InnoDB是默认支持事务的引擎(包括分布式事务),所以需要事务支持的业务引擎应该选择InnoDB

3.InnoDB的数据结构文件和索引文件存储在.ibd后缀的文件中,表结构文件存储在.frm后缀文件中,在MySQL8.0表结构文件合并到.ibd文件中了,后续我会举证说明。

4.相对于MyISAM引擎来说InnoDB引擎更加占用内存和磁盘,因为MyISAM引擎只缓存索引文件,而InnoDB需要缓存索引文件和数据文件,并且InnoDB引擎则需要更多的磁盘存储索引文件、数据文件。

3.MyISAM

1.主要的非事务引擎,不支持事务,使所以不能保证数据一致性、完整性,不执行行级锁、外键,但是有全文索引等特有的功能。

2.MySQL5.5之前的默认存储引擎。

3.数据文件结构表结构是后缀.frm,数据文件是后缀.MYD,索引文件是.MYI

4.访问速度较快,因为MyISAM不需要像InnoDB那样读取的时候去维护MVCC(多版本并发访问)以及维护缓冲块(buffer_pool)因为InnoDB读取数据是由磁盘读取到数据页里的然后再去读取数据页和缓存等,适合读取较多的业务,更新、写入、删除都会锁表,因为不支持行锁。

4.证明

1.InnoDB的数据文件、索引文件以及表结构文件的存放位置在5.7和8.0的区别,如下图,可以看到一个数据库的数据文件和索引文件以及表结构文件都是放在一起的。

5.7可以看到有.ibd.frm文件

image.png

8.0只有.ibd文件

image.png

MyISAM引擎的表结构文件、数据文件、索引文件

image.png

总结

InnoDBMyISAM两个引擎到底怎么选择呢?我个人是更加看好InnoDB的,在MySQL5.7和8.0也陆续引进了MyISAM之前特有的功能了,变的越来越完善,也是市面上和工作中主流的引擎,但是我们还是需要根据业务来决定使用。

image.png