MySQL所支持的多种存储引擎

91 阅读6分钟

文章目录


1. 引入

存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式 。存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型。

MySQL支持的存储引擎包含 : InnoDB 、MyISAM 、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、
ARCHIVE、CSV、BLACKHOLE、FEDERATED等。如果创建表时如果不指定,系统就会使用默认的存储引擎InnoDB,我们可以根据业务的需求选择不同的存储引擎。

我们可以使用show engines来看有哪些存储引擎可供使用;


在这里插入图片描述

在创建表时可以使用ENGINE关键字来指定新建表的存储引擎;

mysql> create table goods_innodb(
    -> id int NOT NULL AUTO_INCREMENT,
    -> name varchar(20) NOT NULL,
    -> primary key(id)
    -> )ENGINE=innodb DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

也可以使用ALTER TABLE语句修改表的存储引擎;

mysql> alter table goods_innodb engine=MyISAM;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table goods_innodb \G
*************************** 1. row ***************************
       Table: goods_innodb
Create Table: CREATE TABLE `goods_innodb` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

常用的数据引擎的对比:

特点InnodbMyISAMMEMORYMERGENDB
存储限制64TB没有
事务安全支持
锁机制行锁表锁表锁表锁行锁
B树索引支持支持支持支持支持
哈希索引支持
全文索引支持支持
集群索引支持
数据索引支持支持
索引缓存支持支持支持支持支持
数据可压缩支持
空间使用N/A
内存使用中等
批量插入速度
支持外键支持

2. MyISAM

MyISAM 不支持事务、也不支持外键,其优势是访问的速度快。建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件:

  • tb_demo.frm:存储表定义
  • tb_demo.MYD:存储数据
  • tb_demo.MYI:存储索引

MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎

适合场景:

  • 选择密集型的表:MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点
  • 插入密集型的表:MyISAM的并发插入特性允许同时选择和插入数据

3. InnoDB

3.1 概述

InnoDB是一个健壮的事务型存储引擎,以下场景是使用InnoDB是最理想的选择:

  • 更新密集的表:InnoDB存储引擎特别适合处理多重并发的更新请求

  • 事务控制:InnoDB存储引擎是支持事务的标准MySQL存储引擎

    • START TRANSACTION:开启事务
    • commit:提交事务
  • 自动灾难恢复:与其它存储引擎不同,InnoDB表能够自动从灾难中恢复

  • 外键约束:在创建外键的时候, 要求父表必须有对应的索引 , 子表在创建外键的
    时候, 也会自动的创建对应的索引

  • 支持自动增加列AUTO_INCREMENT属性

通常来说,InnoDB相比于MyISAM写的效率差一些,并且会占用更多的磁盘空间保留数据和索引。

3.2 外键

在创建索引时, 可以指定在删除、更新父表时,对子表进行的相应操作,包括:

  • RESTRIC/NO ACTION:限制在子表有关联记录更新的情况下,父表不能进行更新
  • CASCAD:父表在更新或删除时,同时更新或者删除子表中的对应的记录
  • SET NULL:父表在更新或者删除时,子表中对应的字段设置为NULL

3.3 存储方式

InnoDB 存储表和索引有以下两种方式 :

  • 使用共享表空间存储:创建的表的表结构保存在.frm文件中, 数据和索引保存在
    innodb_data_home_dir 和 innodb_data_file_path定义的表空间中,可以是多个文件
  • 使用多表空间存储:创建的表的表结构保存在 .frm 文件中,但是每个表的数据和索引单独保存在.ibd 中。

4. MEMORY

使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但是,当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,以下场景适合使用Memory存储引擎:

  • 目标数据较小,而且被非常频繁地访问:在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小
  • 如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中
  • 存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响
  • Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中

5. MERGE

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,MERGE表本身并没有存储数据,对MERGE类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行的。

对于MERGE类型表的插入操作,是通过INSERT_METHOD子句定义插入的表,可以有3个不同的值,使用FIRST 或LAST 值使得插入操作被相应地作用在第一或者最后一个表上,不定义这个子句或者定义为NO,表示不能对这个MERGE表执行插入操作。可以对MERGE表进行DROP操作,但是这个操作只是删除MERGE表的定义,对内部的表是没有任何影响的。


6. ARCHIVE

Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。

在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引。