文章目录
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)
常用的数据引擎的对比:
| 特点 | Innodb | MyISAM | MEMORY | MERGE | NDB |
|---|---|---|---|---|---|
| 存储限制 | 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以后的版本中就开始支持索引。