【后端面经-数据库】MySQL的存储引擎简介
MySQL的存储引擎
mysql主要有四类存储引擎,目前主要使用InnoDB作为存储引擎。
0. 存储引擎的查看和修改
- 查看当前数据库的默认存储引擎
show variables like 'default_storage_engine';
- 查看当前数据库所支持的存储引擎
show engine;//语句1
show variables like 'have_%';//语句2
- 查看支持事务处理的存储引擎
select engine from information_schema.engines where transactions='yes';
- 设置新表的存储引擎
create table 表名 (字段名 字段类型) engine=存储引擎;//语句1
create table 表名 (字段名 字段类型) type=存储引擎;//语句2
1. MyISAM
- 文件组成
- .frm文件:表结构定义,
frame,可以理解成对整体框架的存储 - .MYD文件:数据文件,存储的是具体的数据库数据条目
- .MYI文件:索引文件,存储的是数据库表项的索引文件
如果用图书管理系统做比喻的话,那么,.frm文件存放的是书架本身,.MYD文件存储具体的书籍,.MYI文件存储检索书籍的索引目录。
.MYI文件和.MYD文件可以存储在不同的文件目录中,从而分散IO读写压力,提高访问速度,具体操作可在创建表的时候,通过DATA DIRECTORY和INDEX DIRECTORY属性进行设置。
- .frm文件:表结构定义,
- 适用范围
由于MyISAM不支持事务,不支持外键,访问速度快的特点,适用于以下特点的数据库:
- 不要求事务完整性
- 操作主要是查找SELECT和INSERT - 安全性
MyISAM表中有一个标志,用于存储上次退出表是否是正常退出,每次启动该表之前会检查该标志,如果上次是异常退出,则考虑进行检查和修复。
可使用CHECK TABLE和REPAIR TABLE命令进行表的检查和修改。 - 支持的存储格式
- 静态表:每个条目长度固定
- 动态表:每个条目长度不固定
- 压缩表:压缩存储,节省空间
三者的特点如下所示:

- 优缺点
- 优点:访问速度快,
- 缺点:不支持事务,不支持外键,不支持行级锁,不支持崩溃后的安全恢复,不支持并发插入(性能方面)
2. InnoDB
自动增长列
指的是InnoDB支持用户手动插入的条目遵循索引项的自动增长,而不需要用户自己设置。然而,在InnoDB中,自动增长列必须是索引项,如果是组合索引,则是其中的第一列;而对于MyISAM,则可以是任意数据项。
创建一个表之后,其自动增长列的起始值默认是1,也可以在创建表的时候进行修改:
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=某个起始数字;
在插入条目的时候,也可以通过
ALTER TABLE命令进行修改:ALTER TABLE 具体条目 AUTO_INCREMENT=某个起始数字;
外键约束
- 在本文介绍的四个存储引擎中,只有InnoDB支持外键约束。
- 外键约束可以指定数据表中,对父表的操作如何影响子表,具体参数如下:
restrict:父表的删除和更新不会对子表产生影响cascade:级联操作,父表的删除和更新操作会影响子表,set null:父表的删除和更新将会使得子表中相关条目设置为null值no action:效果等同于restrict,父表的删除和更新操作不会对子表产生影响。
- 外键约束的开关
根据set forgein_key_checks=0或者1的值,可以开启(值为1)或者关闭(值为0)外键约束。
优缺点
- 优点:支持回滚等事务处理
- 缺点:访问效率低,花费内存存储索引结构,占用内存较大
3. MEMORY
- 使用内存内容
MEMORY表使用内存中的数据进行存储管理,因此,在使用期间需要足够的内存空间,当使用结束之后,需要进行内存释放,命令如下DROP FROM MEMORY 表名;
TRUNCATE table 表名;
- hash结构
MEMORY表的索引结构为hash,因此,有很快的访问速度,但是也引申出对于数据库操作指令的响应性能问题:- 相等比较:
=,<=>,性能较好 - 范围比较:
>,<,BETWEEN,IN,LIKE,性能较差 - 排序比较:
order by,性能较差
可通过改进为B树结构来提高性能
- 相等比较:
- 文件组成:
使用内存中的数据来存储,只需要一个.frm文件,用于存储表结构定义。 - 固定长度存储
创建该表的时候,需要设置固定长度,内部的条目长度固定,可设置最大行数来确定所需要的内存大小,max_heap_table_size参数用于设置最大行数。
因此,对于TEXT、BLOB等可变长度数据类型并不支持,但是对于VARCHAR数据类型,在实际的数据库操作中依然看作固定长度,因此可支持VARCHAR数据类型。 - 优缺点
根据上文的分析,可得出MEMORY表的优缺点如下:- 优点: 访问速度快,使用hash存储对于相等比较操作性能良好,使用内存中的数据而不用额外生成新文件
- 缺点: 只支持固定长度的数据条目,对于可变长度的数据类型不支持,且使用hash索引,对于范围、排序类的数据比较操作性能较差,需要额外释放内存。
4. MERGE
- 文件组成
- .frm: 存储表的框架信息
- .MRG:存储表的定义信息
- 具体操作
Merge存储引擎相当于MyISAM的一个集合,需要多个表结构相同的MyISAM组合,本身并不存在数据,仅仅是一个结构,增删改查等操作还是需要对于具体的MyISAM表进行操作。 - 优缺点
- 优点: 管理多个MyISAM表,方便操作
- 缺点: 本身是多个MyISAM表的复合表,因此,MyISAM表的缺点都有。
5. 总结
对上述四种存储引擎进行比较,得出如下表格:

6. 参考博客
【后端面经-数据库】MySQL的存储引擎简介的更多相关文章
- MySQL MERGE存储引擎 简介及用法
MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必 ...
- MySQL MERGE存储引擎 简介
MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必 ...
- MySql学习- 存储引擎简介
mysql可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎. 每一种存储引擎使用不同的存储机制.索引技巧.锁定水平,最终提供广泛且不同的功能. MySQL支持的存储引擎: MyISA ...
- MySQL更改数据库表的存储引擎
MySQL更改数据库表的存储引擎 1.查看表的原存储引擎 show create table user; 'user', 'CREATE TABLE `user` (\n `id` int(11) N ...
- MySQL数据库的各种存储引擎详解
原文来自:MySQL数据库的各种存储引擎详解 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...
- [转帖]一文看懂mysql数据库本质及存储引擎innodb+myisam
一文看懂mysql数据库本质及存储引擎innodb+myisam https://www.toutiao.com/i6740201316745740807/ 原创 波波说运维 2019-09-29 0 ...
- 浅谈MySql的存储引擎(表类型)
来源:http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到 ...
- MySQL之浅谈MySQL的存储引擎
什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等 ...
- 浅谈MySql的存储引擎(表类型) (转)
什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其实是 ...
- MySQL常用存储引擎
MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB.BDB. 2. 非事务安全表:MyISAM.MEMORY.MERGE.EXAMPLE.NDB Cluster.ARCHIVE.CSV. ...
随机推荐
- pandas之聚合函数
在<Python Pandas窗口函数>一节,我们重点介绍了窗口函数.我们知道,窗口函数可以与聚合函数一起使用,聚合函数指的是对一组数据求总和.最大值.最小值以及平均值的操作,本节重点讲解 ...
- 四月十九号java基础知识
1.总括:类的继承是使用已有的类为基础派生出新的类.通过类继承的方式,便能开发出新的类,而不需要编写相同的程序代码,所以说类的继承是程序代码再利用的概念抽象与接口都是类概念的扩展.通过继承扩展出的子类 ...
- 关于取消DevTools listening on ws://127.0.0.1…提示的方法
Python代码写好之后,通过任务计划程序定期执行.py文件,但总会有命令窗口,虽然不影响程序执行,但每次需要手动叉掉比较烦.于是我网上搜索了一些方法. 网上的方法并没有直接解决我的问题,但我借助搜索 ...
- DG:RFS[8]: No standby redo logfiles created for thread 2
环境:两节点的RAC在线搭建DG,处理报错 现象:RFS[8]: No standby redo logfiles created for thread 2 ,thread2 没有建立redo Tue ...
- Redis缓冲区溢出及解决方案
缓冲区(buffer),是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区. 一.Redis缓冲区溢出影响 在Redis ...
- 【LeetCode】232.使用栈模拟队列
使用栈模拟队列 请你仅使用两个栈实现先入先出队列.队列应当支持一般队列支持的所有操作(push.pop.peek.empty):实现 MyQueue 类: void push(int x) 将元素 ...
- The first week match's mistake-2
旋转排列 (https://www.luogu.com.cn/problem/B3688) 解读一下题目: 要求从给定的数组拿出最后一个数字后 看看变化后的数组的最后一个数字是否是要求的数字 想到用栈 ...
- Vue中Key值的一些问题
1. Vue里面的key是一个特殊的变量,在元素当中是不体现出来的 2. 在解析成虚拟DOM的是,如果我们没有写key值,那么这个key就类似于下标 0 , 1 , 2 , 3.... 3. 使用列表 ...
- C盘爆满的解决方法,不用删除文件,使用分区助手无损增加内存
一.分区助手傲梅科技 对于我们C盘内存不足的来说,老师推荐的yyds. 我的内存C盘历史最低是900多M,1.5G还是多的,经过我不断的删除文件,发现没什么用,电脑用久了C盘文件占内存自然就多了!!改 ...
- node安装node-sass
安装node-sass使用node版本不能太高,否则会报错 checking for Python executable "C:\Program Files\python" in ...