MySQL之存储引擎

362 阅读4分钟

存储引擎

MySQL服务端接收到客户单的请求以及完成查询优化后,还需要对数据进行读取或者写入的操作,对数据的读写操作其实是由名叫存储引擎的模块完成的。

从逻辑角度,表是由一行一行的数据记录组成的,但是在物理上如何表示记录,如何读取或写入数据到具体的物理存储器上,由具体的存储引擎负责,为了实现不同的功能,MySQL有多种存储引擎,每种引擎管理的表可能有不同的存储结构,采用的存取算法也可能不同。

连接管理、查询缓存、语法解析、查询优化这些不涉及到真实数据存储的功能被统一称为server层的功能,涉及到真实数据操作被划分为存储引擎的功能。

存储引擎为server层提供了统一的调用接口,例如读取索引第一条记录读取索引下一条记录插入记录等,

server层完成查询优化以后,根据执行计划调用存储引擎提供的接口,将获取到的结果返回给客户端即可,server层与存储引擎交互时,以记录为单位,

例如select语句,server层先向存储引擎取一条记录,然后判断是否符合where条件,如果符合就返回给客户端(其实是先发送到一个缓冲区,等缓冲区满了才会返回给客户端缓冲区里的数据,缓冲区的大小由系统变量net_buffer_length控制),否则跳过,继续向存储引擎获取下一条记录。

常用存储引擎

MySQL支持的存储引擎如下,最常用的有InnoDB、MyISAM、NDB,InnoDB是MySQL默认使用的存储引擎(5.5.5版本之前是MyISAM)。

存储引擎描述
ARCHIVE用于数据存档(记录插入后不能再修改)
BLACKHOLE丢弃写操作,读操作返回空内容
CSV存储数据时,以逗号分隔各个数据项
FEDERATED用于访问远程表
InnoDB支持事务、行级锁、外键
MEMORY数据只存储在内存,不存储在磁盘,一般用于临时表
MERGE用于管理多个MyISAM表构成的表集合
MyISAM非事务处理存储引擎
NDBMySQL集群存储引擎

存储引擎功能对比:

功能MyISAMMEMORYInnoDBARCHIVENDB
B-tree indexes
Backup/point-in-time recovery
Cluster database support
Clustered indexes
Compressed data
Data cachesN/A
Encrypted data
Foreign key support
Full-text search indexes
Geospatial data type support
Geospatial indexing support
Hash indexes
Index cachesN/A
Locking granularity
MVCC
Query cache support
Replication support有限支持
Storage limits256TBRAM64TB无存储限制384EB
T-tree indexes
Transcations
Update statistics fro data dictionary

引擎相关操作

1. 查看服务端支持的引擎列表

SHOW ENGINES; 使用该SQL查看服务端支持的引擎列表。

image.png

  1. Support列表示存储引擎是否可用,DEFAULT代表是当前默认使用的引擎。

  2. Comment列是对存储引擎的描述。

  3. Transaction表示存储引擎是否支持事务处理。

  4. XA列表示存储引擎是否支持分布式事务。

  5. Savepoints列代表该存储引擎是否支持事务部分回滚。

2. 设置表的存储引擎

存储引擎负责表数据的读取和写入操作,同一个数据库中不同的表可以用不同的引擎,也就是不同的读取和写入方式。

1. 创建表时设置

创建表时,如果没有指定引擎,那么将使用默认的引擎,指定引擎的写法如下:

CREATE TABLE 表名(
    建表语句
) ENGINE = 存储引擎名称;

例子,创建一个MyISAM的表:

CREATE TABLE engine_demo_table(
    i int
) ENGINE = MyISAM;

2. 修改表的存储引擎

修改表引擎如下:

ALTER TABLE 表名 ENGINE = 存储引擎名称

3. 查看表的存储引擎

SHOW CREATE TABLE 表名;

将显示建表语句,其中有引擎的信息 ENGINE=InnoDB

CREATE TABLE `goods` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '商品名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=501 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci