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 DIRECTORY和INDEX DIRECTORY属性进行设置。
  2. 适用范围

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

    - 不要求事务完整性

    - 操作主要是查找SELECT和INSERT
  3. 安全性

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

    可使用CHECK TABLE和REPAIR 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,因此,有很快的访问速度,但是也引申出对于数据库操作指令的响应性能问题:

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

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

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

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

    因此,对于TEXT、BLOB等可变长度数据类型并不支持,但是对于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. 1.HVV介绍

    HVV介绍 1.护网职责划分 红队:打点人员.攻击人员.社工人员 蓝队:监控人员.研判人员.溯源人员 2.护网需要具备的技能 红队: 外围打点能力.漏洞挖掘能力.漏洞分析能力.权限提升能力.权限维持能 ...

  2. 一些随笔No.3

    1.开发应以业务为导向,技术只是手段 2.视觉上和程序上不一定是完全符合 比如,我所说的阻塞是视觉层面,或者是对用户而言的阻塞,而不是程序意义上的.我也许会传完参的同时销毁原组件,生成一个看起来一模一 ...

  3. kubernetes 设置 Master 可调度与不可调度

    kubernetes 设置 Master 可调度与不可调度 语法 kubectl taint node [node] key=value[effect] [effect] 可取值: [ NoSched ...

  4. python之pdf转换操作 PyMuPDF库学习

    1. 资料链接github地址: pymupdf/PyMuPDF: Python bindings for MuPDF's rendering library官方手册: PyMuPDF Documen ...

  5. [数据库/MySQL]解决异常:Data truncation: Truncated incorrect DOUBLE value: 'dc5'

    1 场景复现 MySQL: 5.7.24-27 表结构 (两张独立的表) [表 RRR1] CREATE TABLE `RRR1` ( `R1` float NOT NULL COMMENT 'R1' ...

  6. [Java]排序算法>插入排序>【直接插入排序】(O(N*N)/稳定/N较小/有序/顺序存储+链式存储)

    1 直接插入排序 1.1 算法思想 插入排序的基本思想是:每一趟将1个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止. 1.2 算法特征 属于[插 ...

  7. [Asp.Net Core] 网站中的XSS跨站脚本攻击和防范

    漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...

  8. ping功能实现(ICMP)

    简单记录下项目中ping功能实现 笔记:ping功能实现 void Handler::handlePingDepot(const char *ip) { int mSize=50*1024; bzer ...

  9. ts中报错信息收集

    1. 错误代码 参考:https://www.mmbyte.com/article/92849.html 1 state.localuserInfo = JSON.parse(localStorage ...

  10. 记一道国际赛CTF web题

    这是一篇关于打d3ctf坐牢,无奈去打国际赛的题解. TAMUCTF [Blackbox] 首先打开页面,然后发现一个登陆框 刚开始最先想到就是弱口令登陆,尝试几个后发现登陆不进去. 之后我就换了一个 ...