MySQL存储引擎
Posted SurpriseSui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL存储引擎相关的知识,希望对你有一定的参考价值。
最近碰到面试题问到mysql存储引擎,然后发现自己有点懵。。。回来后看了相关知识点,希望对以后面试的各位有帮助
先看看自己数据库默认当前的存储引擎:输入show variables like \'%storage_engine%\';
MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM)
再查看mysql有哪些引擎:输入 show engines
看到许多博客和相关介绍常用到的引擎主要有:MyISAM 、InnoDB 、MEMORY 、MERGE
尴尬的是不确定MyISAM 和 InnoDB 怎么发音,然后搜索了一下 MyISAM 发音为 "my-z[ei]m"; InnoDB 发音为 "in-no-db"
下图是根据查看相关博客以及参考存储引擎对比做的一张比较表格:
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是默认推荐存储引擎就可以显而易见,最好的肯定拿出来当牌面用。
以上是关于MySQL存储引擎的主要内容,如果未能解决你的问题,请参考以下文章