## 16.1 设置存储引擎

创建新表时，可以通过添加`引擎`表选项[`创建表`](create-table.html)陈述：

```
-- ENGINE=INNODB not needed unless you have set a different
-- default storage engine.
CREATE TABLE t1 (i INT) ENGINE = INNODB;
-- Simple table definitions can be switched from one to another.
CREATE TABLE t2 (i INT) ENGINE = CSV;
CREATE TABLE t3 (i INT) ENGINE = MEMORY;
```

当你省略`引擎`选项，使用默认存储引擎。默认引擎是[`InnoDB`](innodb-storage-engine.html)在 MySQL 8.0 中。您可以使用[`--默认存储引擎`](server-system-variables.html#sysvar_default_storage_engine)服务器启动选项，或通过设置[`默认存储引擎`](server-system-variables.html#sysvar_default_storage_engine)中的选项`我的.cnf`配置文件。

您可以通过设置当前会话的默认存储引擎[`default_storage_engine`](server-system-variables.html#sysvar_default_storage_engine)多变的：

```
SET default_storage_engine=NDBCLUSTER;
```

存储引擎`暂时的`创建的表[`创建临时表`](create-table.html)可以通过设置[`default_tmp_storage_engine`](server-system-variables.html#sysvar_default_tmp_storage_engine)，无论是在启动时还是在运行时。

要将表从一个存储引擎转换为另一个，请使用[`更改表`](alter-table.html)表示新引擎的语句：

```
ALTER TABLE t ENGINE = InnoDB;
```

看[第 13.1.20 节，“CREATE TABLE 语句”](create-table.html)， 和[第 13.1.9 节，“ALTER TABLE 语句”](alter-table.html).

如果您尝试使用未编译或已编译但停用的存储引擎，MySQL 会使用默认存储引擎创建表。例如，在复制设置中，也许您的源服务器使用`InnoDB`表以获得最大的安全性，但副本服务器使用其他存储引擎以牺牲持久性或并发性来提高速度。

默认情况下，每当[`创建表`](create-table.html)要么[`更改表`](alter-table.html)无法使用默认存储引擎。为防止在所需引擎不可用时出现令人困惑的意外行为，请启用[`NO_ENGINE_SUBSTITUTION`](sql-mode.html#sqlmode_no_engine_substitution)SQL 模式。如果所需的引擎不可用，则此设置会产生错误而不是警告，并且不会创建或更改表。看[第 5.1.11 节，“服务器 SQL 模式”](sql-mode.html).

MySQL 可能会将表的索引和数据存储在一个或多个其他文件中，具体取决于存储引擎。表和列定义存储在 MySQL 数据字典中。各个存储引擎创建它们管理的表所需的任何附加文件。如果表名包含特殊字符，则表文件的名称包含这些字符的编码版本，如[第 9.2.4 节，“标识符到文件名的映射”](identifier-mapping.html).
