存储引擎概述¶
为了方便管理,把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为 MySQL Server 的功能,把真实存取数据的功能划分为存储引擎的功能。所以在 MySQL server 完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的 API,获取到数据后返回给客户端就好了。
MySQL 中提到了**存储引擎**的概念,简而言之,存储引擎就是指表的类型。其实存储引擎以前叫做表处理器,后来改名为存储引擎,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。
可以通过如下SQL语句来查询MySQL支持的各种存储引擎
show engines;
SELECT * FROM INFORMATION_SCHEMA.ENGINES;
| Engine | Support | Comment | Transactions | XA | Savepoints |
|---|---|---|---|---|---|
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
Blackhole¶
Blackhole引擎充当一个**黑洞**,接受数据,但将其扔掉,不存储数据。
Blackhole引擎支持各种索引,所以建表时可以包含索引声明。Blackhole表支持触发器,因为实际上并不存储数据,因此不会触发UPDATE和DELETE触发器,INSERT触发器会触发。
Blackhole引擎这么特别,如果真的没有用处,也就不可能存在,那它到底有什么价值呢?官方文档列举了几个:
- Replication场景实现中继或过滤
- 校验dump文件语法。
- 测量开启 binlog 日志所带来的额外开销。
- 查找和存储引擎无关的其他方面的性能瓶颈。
我们来看看Replication场景实现中继或过滤这种。
Insert到Blackhole表中不会存储数据,但如果启用了基于语句的二进制日志记录,则会记录SQL语句到binlog日志。这可以用作中继器或过滤机制。
假设业务需要slave端过滤,但是将所有binlog日志传输到slave端会导致太多流量。在这种情况下,可以在 master主机上设置一个默认存储引擎为Blackhole的“dummy”从进程
MEMORY存储引擎¶
Memory 存储引擎 是 MySQL 中一种高性能但非持久化的存储方案,适合临时数据存储和缓存场景。其核心优势在于极快的读写速度,需注意数据丢失风险和内存占用限制。它用于创建内存中的表,数据存储在内存,访问快速但重启后数据丢失。通过--init-file启动mysqld可持久化数据。
在使用时需结合业务需求,合理配置参数(如max_heap_table_size),并避免将其用于需要持久化或事务支持的场景。