跳转至

存储引擎概述

为了方便管理,把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为 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),并避免将其用于需要持久化或事务支持的场景。