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

  1. 文件组成

    • .frm文件:表结构定义,frame,可以理解成对整体框架的存储
    • .MYD文件:数据文件,存储的是具体的数据库数据条目
    • .MYI文件:索引文件,存储的是数据库表项的索引文件

      如果用图书管理系统做比喻的话,那么,.frm文件存放的是书架本身,.MYD文件存储具体的书籍,.MYI文件存储检索书籍的索引目录。

      .MYI文件.MYD文件可以存储在不同的文件目录中,从而分散IO读写压力,提高访问速度,具体操作可在创建表的时候,通过DATA DIRECTORYINDEX DIRECTORY属性进行设置。
  2. 适用范围

    由于MyISAM不支持事务,不支持外键,访问速度快的特点,适用于以下特点的数据库:

    - 不要求事务完整性

    - 操作主要是查找SELECTINSERT
  3. 安全性

    MyISAM表中有一个标志,用于存储上次退出表是否是正常退出,每次启动该表之前会检查该标志,如果上次是异常退出,则考虑进行检查和修复。

    可使用CHECK TABLEREPAIR TABLE命令进行表的检查和修改。
  4. 支持的存储格式
    • 静态表:每个条目长度固定
    • 动态表:每个条目长度不固定
    • 压缩表:压缩存储,节省空间

三者的特点如下所示:

  1. 优缺点

    1. 优点:访问速度快,
    2. 缺点:不支持事务,不支持外键,不支持行级锁,不支持崩溃后的安全恢复,不支持并发插入(性能方面)

2. InnoDB

  1. 自动增长列

    指的是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=某个起始数字;
  2. 外键约束

    • 在本文介绍的四个存储引擎中,只有InnoDB支持外键约束。
    • 外键约束可以指定数据表中,对父表的操作如何影响子表,具体参数如下:
      • restrict:父表的删除和更新不会对子表产生影响
      • cascade:级联操作,父表的删除和更新操作会影响子表,
      • set null:父表的删除和更新将会使得子表中相关条目设置为null
      • no action:效果等同于restrict,父表的删除和更新操作不会对子表产生影响。
    • 外键约束的开关

      根据set forgein_key_checks=0或者1的值,可以开启(值为1)或者关闭(值为0)外键约束。
  3. 优缺点

    1. 优点:支持回滚等事务处理
    2. 缺点:访问效率低,花费内存存储索引结构,占用内存较大

3. MEMORY

  1. 使用内存内容

    MEMORY表使用内存中的数据进行存储管理,因此,在使用期间需要足够的内存空间,当使用结束之后,需要进行内存释放,命令如下
    DROP FROM MEMORY 表名;
    TRUNCATE table 表名;
  2. hash结构

    MEMORY表的索引结构为hash,因此,有很快的访问速度,但是也引申出对于数据库操作指令的响应性能问题:

    • 相等比较:=<=>,性能较好
    • 范围比较:><BETWEENINLIKE,性能较差
    • 排序比较:order by,性能较差

      可通过改进为B树结构来提高性能
  3. 文件组成:

    使用内存中的数据来存储,只需要一个.frm文件,用于存储表结构定义。
  4. 固定长度存储

    创建该表的时候,需要设置固定长度,内部的条目长度固定,可设置最大行数来确定所需要的内存大小,max_heap_table_size参数用于设置最大行数。

    因此,对于TEXTBLOB等可变长度数据类型并不支持,但是对于VARCHAR数据类型,在实际的数据库操作中依然看作固定长度,因此可支持VARCHAR数据类型。
  5. 优缺点

    根据上文的分析,可得出MEMORY表的优缺点如下:

    • 优点: 访问速度快,使用hash存储对于相等比较操作性能良好,使用内存中的数据而不用额外生成新文件
    • 缺点: 只支持固定长度的数据条目,对于可变长度的数据类型不支持,且使用hash索引,对于范围、排序类的数据比较操作性能较差,需要额外释放内存。

4. MERGE

  1. 文件组成

    • .frm: 存储表的框架信息
    • .MRG:存储表的定义信息
  2. 具体操作

    Merge存储引擎相当于MyISAM的一个集合,需要多个表结构相同的MyISAM组合,本身并不存在数据,仅仅是一个结构,增删改查等操作还是需要对于具体的MyISAM表进行操作。
  3. 优缺点
    • 优点: 管理多个MyISAM表,方便操作
    • 缺点: 本身是多个MyISAM表的复合表,因此,MyISAM表的缺点都有。

5. 总结

对上述四种存储引擎进行比较,得出如下表格:

6. 参考博客

【后端面经-数据库】MySQL的存储引擎简介的更多相关文章

  1. MySQL MERGE存储引擎 简介及用法

    MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必 ...

  2. MySQL MERGE存储引擎 简介

    MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必 ...

  3. MySql学习- 存储引擎简介

    mysql可以将数据以不同的技术存储在文件(内存)中,这种技术就称为存储引擎. 每一种存储引擎使用不同的存储机制.索引技巧.锁定水平,最终提供广泛且不同的功能. MySQL支持的存储引擎: MyISA ...

  4. MySQL更改数据库表的存储引擎

    MySQL更改数据库表的存储引擎 1.查看表的原存储引擎 show create table user; 'user', 'CREATE TABLE `user` (\n `id` int(11) N ...

  5. MySQL数据库的各种存储引擎详解

    原文来自:MySQL数据库的各种存储引擎详解   MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...

  6. [转帖]一文看懂mysql数据库本质及存储引擎innodb+myisam

    一文看懂mysql数据库本质及存储引擎innodb+myisam https://www.toutiao.com/i6740201316745740807/ 原创 波波说运维 2019-09-29 0 ...

  7. 浅谈MySql的存储引擎(表类型)

    来源:http://www.cnblogs.com/lina1006/archive/2011/04/29/2032894.html 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到 ...

  8. MySQL之浅谈MySQL的存储引擎

    什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合.     我们通常说的MySql数据库,sql server数据库等 ...

  9. 浅谈MySql的存储引擎(表类型) (转)

    什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库,sql server数据库等等其实是 ...

  10. MySQL常用存储引擎

    MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB.BDB. 2. 非事务安全表:MyISAM.MEMORY.MERGE.EXAMPLE.NDB Cluster.ARCHIVE.CSV. ...

随机推荐

  1. 浅学git工具

    1.git工具介绍及使用 git工具直接安装: 直接运行exe文件进行安装,按默认的操作点击下一步就行了 校验: 在DOS命令行中输入:git  --version 如果能正常显示出对应的版本就是ok ...

  2. Python安装-在Linux系统中使用编译进行安装

    Python安装-在Linux系统中使用编译进行安装 你可以使用Ubuntu自带的Python3,不过你不能自由的控制版本,还要单独安装pip3,如果你想升级pip3,还会出现一些让人不愉快的使用问题 ...

  3. 月光宝盒(vivo流量录制回放平台)正式对外开源

    作者:vivo 互联网服务器团队- Liu Yanjiang 月光宝盒是一个基于流量录制回放的自动化测试平台,通过录制回放取代编写脚本进行自动化回归,提升测试效率和覆盖率.因为其解决方案具有很强的通用 ...

  4. Zabbix_sender基础命令浅析

    zabbix_sender是Zabbix监控系统中用于向Zabbix服务器发送数据的命令行工具.以下是zabbix_sender基础命令教学: 语法: zabbix_sender -z <ser ...

  5. 动态规划DP入门问题----最大连续子序列,最长不下降子序列(可以不连续),最长公共子序列

    一.最大连续子序列 1.题目叙述 对于一个数字序列A1A2A3...An,求出连续子序列的最大和,如对于序列-2,11,-4,13,-5,-2,其中的最大序列和是11+(-4)+13=20 2.动态规 ...

  6. Java工作环境的配置与Eclipse的安装

    如果您觉得这篇文章有用,请点个赞呀! Eclipse是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.Eclipse 附带了一个标 ...

  7. odoo wizard界面显示带复选框列表及勾选数据获取

    实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下图(非实际项目界面截图,仅用于介绍本文主题),打开记录详情页(form视图),点击某个按钮(图中的 ...

  8. 这是一篇记录——django-xadmin重新开发记录

    利用下面的代码把django的版本换成和xadmin2适配的版本,注意xadmin最新版本出了3.0但是就是一个纯前端的框架,和之前的版本差异较大. 因为此时距离ddl不到24小时,所以使用旧的版本. ...

  9. 今天能恢复我的Django吗——恢复了!

    今天能用两小时恢复我的Django吗 实在是累了,昨天和队友改bug的时候为了能在我的电脑上实现他的程序就在datagrip中删了我django建的表.没想到啊,这一删就全是报错!! 不说了,今天看看 ...

  10. linux发行版中的i386/i686/x86-64/的区别

    在yum上找32位的i386找不到,看到i686以为是64位呢,原来它也是32位啊 i686 只是i386的一个子集,支持的cpu从Pentium 2 (686)开始,之前的型号不支持. 备注: 1. ...