一、存储引擎介绍
为了管理方便,人们把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为MySQL server的功能,把真实存取数据的功能划分为存储引擎的功能。所以在MySQL server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。
也就是:
- MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。
- 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。
- MySQL数据库中的组件,负责执行实际的数据I/O操作。
- MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。
二、查看存储引擎
通过命令查看mysql提供了哪些存储引擎:
show engines;
如下:
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
三、常见存储引擎
1.InnoDB
优点:
- 支持外键。
- 支持事务,支持4个事务隔离级别,保证数据的完整性。
- 支持行级锁。
- InnoDB是为处理巨大数据量的最大性能设计。
- 在以前的版本中,字典数据以元数据文件、非事务表等来存储。现在这些元数据文件被删除 了。比如: .frm , .par等都在MySQL8.0中不存在了,只有一个.ibd的文件,用于存放索引和数据(在InnoDB中索引即数据)。
缺点:
- 对比MyISAM的存储引擎, InnoDB写的处理效率差一些 ,并且会占用更多的磁盘空间以保存数据和索引。
- MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据, 对内存要求较高 ,而且内存大小对性能有决定性的影响。
除非有非常特别的原因需要使用其他的存储引擎,否则一般都优先考虑InnoDB引擎。
2.MyISAM
特点:
- MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM 不支持事务、行级 锁、外键 ,有一个毫无疑问的缺陷就是崩溃后无法安全恢复 。
- 优势是访问的速度快 ,对事务完整性没有要求或者以SELECT、INSERT为主的应用。
- 表级锁定形式,数据在更新时锁定整个表
- 数据文件的结构为:
- 表名.frm 存储表结构
- 表名.MYD 存储数据 (MYData)
- 表名.MYI 存储索引 (MYIndex)
- 应用场景:只读应用或者以读为主的业务
和InnoDB存储引擎的一个对比:
对比项 | MyISAM | InnoDB |
---|---|---|
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住 整个表,不适合高并发的操作 | 行锁,操作时只锁某一行,不对其它行有影响, 适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较 高,而且内存大小对性能有决定性的影响 |
关注点 | 性能:节省资源、消耗少、简单业 务 | 事务:并发写、事务、更大资源 |
3.Archive
- 用于数据的存档,仅仅支持插入和查询两种功能,不支持修改删除
- 拥有很好的压缩机制,使用zlib压缩库,数据体积非常小
- 再创建ARCHIVE表时,数据文件的扩展名为.ARZ
- 支持行级锁
- Archive表适合日志和数据采集类应用,适合存储大量的独立的作为历史记录的数据。有很高的插入速度,但是对查询的支持较差
4.Blackhole
- 没有任何的存储机制,它会丢弃所有的插入数据,不做任何保存,读操作会返回空内容
- 但服务器会记录blackhole表的日志,所以可以用于复制数据到备库,或简单地记录到日志
5.CSV
- 存储数据时,以逗号分隔各个数据项
- CSV引擎数据存储的就是.CSV后缀的文件,可以直接使用EXCEL打开
- CSV可以作为一种数据交换的机制
- 对于数据的快速导入、到处有明显优势
CSV表每个字段都不能为空
6.Memory
Memory采用的逻辑介质是内存, 响应速度很快 ,数据易丢失 。另外,要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。
- 同时支持哈希(HASH)索引和B+树索引。
- Memory表至少比MyISAM表要快一个数量级 。
- Memory表的大小是受到限制的。表的大小主要取决于两个参数,分别是 max_rows 和max_heap_table_size 。其中,max_rows可以在创建表时指定;max_heap_table_size的大小默认为16MB,可以按需要进行扩大。
- 数据文件与索引文件分开存储,表的结构存储在.frm文件中,数据放在内存中
- 缺点:其数据易丢失,生命周期短。
7.Federated
- 访问远程表
- Federated引擎是访问其他MySQL服务器的一个代理 ,尽管该引擎看起来提供了一种很好的 跨服务器的灵活性 ,但也经常带来问题,因此默认是禁用的 。
8.Merge
- 管理多个MyISAM表构成的表集合
9.NDB
- MySQL集群专用存储引擎
四、设置系统默认的存储引擎
show variables like '%storage_engine%';
#或
SELECT @@default_storage_engine;
结果为:
mysql> show variables like '%storage_engine%';
+---------------------------------+-----------+
| Variable_name | Value |
+---------------------------------+-----------+
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。 修改默认存储引擎:
SET DEFAULT_STORAGE_ENGINE=MyISAM
或者修改 my.cnf 文件:
default-storage-engine=MyISAM
# 重启服务
systemctl restart mysqld.service