最近碰到面试题问到MySQL存储引擎,然后发现自己有点懵。。。回来后看了相关知识点,希望对以后面试的各位有帮助

先看看自己数据库默认当前的存储引擎:输入show variables like '%storage_engine%'; 

MySQL存储引擎-LMLPHP

MySQL存储引擎-LMLPHP

MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM)

再查看mysql有哪些引擎:输入 show engines

MySQL存储引擎-LMLPHP

看到许多博客和相关介绍常用到的引擎主要有:MyISAM 、InnoDB 、MEMORY 、MERGE 

尴尬的是不确定MyISAM 和 InnoDB 怎么发音,然后搜索了一下 MyISAM 发音为 "my-z[ei]m"; InnoDB 发音为 "in-no-db" 

下图是根据查看相关博客以及参考存储引擎对比做的一张比较表格:

MySQL存储引擎-LMLPHP

InnoDB :

提供了具有提交、回滚、崩溃恢复能力的事务安全,但是会占用更多空间用以保存数据和索引。

支持外键,创建外键的时候,要求父表必须有对应的索引,子表在创建索引的时候也会自动创建对应的索引。

存储表和索引有两种方式,

使用共享表空间存储,表结构保存在.frm文件中,数据和索引在innodb_data_home_dir和innodb_data_file_path定义的表空间中,可以是多个文件。

使用多表空间存储,表结构保存在.frm文件中,每个表的数据和索引单独保存在.ibd中。

具体可以参考链接详细介绍Innodb:https://www.cnblogs.com/Aiapple/p/5689634.html

 MyISAM :

MySQL默认数据库引擎,不支持事务、外键,速度快,用于无事务要求或者select、insert为主的场景。

会创建3个文件.frm(存储表定义),.MYD(MYData,存储数据),.MYI(MYIndex,存储引擎)。

支持3中存储格式,静态(固定长度)表,动态表,压缩表。

静态表是默认格式,固定长度速度快,但是占空间大。记录长度不够时会用空格填充,读取数据时会清除空格,存在吃尾部空格的情况。

动态表包含变长字段,记录不是固定长度,占用空间少,但是频繁更新和删除会产生随便,需要定期整理,并且在出现故障时恢复比较困难。

压缩表由mysiampack工具创建,空间小。

MEMORY:

使用存在于内存中的内容来创建表,访问速度快,默认使用HASH索引,服务关闭数据会丢失。

用于内容变化不频繁的代码表,或者作为统计操作的中间结果表。

MERGE:

一组MyISAM表的组合,这些表必须结构完全相同。

MERGE表本身没有数据,CRUD时其实操作的是内部的MyISAM表。

Drop只是删除MERGE的定义,对于内部表没有影响。

 总结:现在MySQL5.5以后默认的存储引擎是Innodb,现在许多大厂云服务器不支持MyISAM.建议详细了解Innodb就可以了。

          MyISAM和Innodb如何选择,取决于你是否需要支持事物,如果表中大多数都是查询可以考虑MyISAM,读写频繁可以选择Innodb。不过系统崩溃情况下,MyISAM回复比较困难。其实从Innodb是默认推荐存储引擎就可以显而易见,最好的肯定拿出来当牌面用。

03-25 16:55