存储引擎
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 | 非事务处理存储引擎 |
| NDB | MySQL集群存储引擎 |
存储引擎功能对比:
| 功能 | MyISAM | MEMORY | InnoDB | ARCHIVE | NDB |
|---|---|---|---|---|---|
| B-tree indexes | 是 | 是 | 是 | 否 | 否 |
| Backup/point-in-time recovery | 是 | 是 | 是 | 是 | 是 |
| Cluster database support | 否 | 否 | 否 | 否 | 是 |
| Clustered indexes | 否 | 否 | 否 | 否 | 是 |
| Compressed data | 是 | 否 | 是 | 是 | 否 |
| Data caches | 否 | N/A | 是 | 否 | 是 |
| Encrypted data | 是 | 是 | 是 | 是 | 是 |
| Foreign key support | 否 | 否 | 是 | 否 | 是 |
| Full-text search indexes | 是 | 否 | 是 | 否 | 否 |
| Geospatial data type support | 是 | 否 | 是 | 是 | 是 |
| Geospatial indexing support | 是 | 否 | 是 | 否 | 否 |
| Hash indexes | 否 | 是 | 否 | 否 | 是 |
| Index caches | 是 | N/A | 是 | 否 | 是 |
| Locking granularity | 表 | 表 | 行 | 行 | 行 |
| MVCC | 否 | 否 | 是 | 否 | 否 |
| Query cache support | 是 | 是 | 是 | 是 | 是 |
| Replication support | 是 | 有限支持 | 是 | 是 | 是 |
| Storage limits | 256TB | RAM | 64TB | 无存储限制 | 384EB |
| T-tree indexes | 否 | 否 | 否 | 否 | 是 |
| Transcations | 否 | 否 | 是 | 否 | 是 |
| Update statistics fro data dictionary | 是 | 是 | 是 | 是 | 是 |
引擎相关操作
1. 查看服务端支持的引擎列表
SHOW ENGINES; 使用该SQL查看服务端支持的引擎列表。
-
Support列表示存储引擎是否可用,DEFAULT代表是当前默认使用的引擎。
-
Comment列是对存储引擎的描述。
-
Transaction表示存储引擎是否支持事务处理。
-
XA列表示存储引擎是否支持分布式事务。
-
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