1

【后端面经-数据库】MySQL的存储引擎简介 - CrazyPixel

 1 year ago
source link: https://www.cnblogs.com/CrazyPixel/p/17470535.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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=某个起始数字;
    
    • 在本文介绍的四个存储引擎中,只有InnoDB支持外键约束。
    • 外键约束可以指定数据表中,对父表的操作如何影响子表,具体参数如下:
      • restrict:父表的删除和更新不会对子表产生影响
      • cascade:级联操作,父表的删除和更新操作会影响子表,
      • set null:父表的删除和更新将会使得子表中相关条目设置为null
      • no action:效果等同于restrict,父表的删除和更新操作不会对子表产生影响。
    • 外键约束的开关
      根据set forgein_key_checks=0或者1的值,可以开启(值为1)或者关闭(值为0)外键约束。
    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表的缺点都有。

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

在这里插入图片描述

6. 参考博客


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK