# MySQL 存储引擎

> 原文： [http://zetcode.com/databases/mysqltutorial/storageengines/](http://zetcode.com/databases/mysqltutorial/storageengines/)

在本章中，我们将讨论 MySQL 存储引擎。

存储引擎是软件模块，数据库管理系统使用该软件模块来创建，读取和更新数据库中的数据。 MySQL 中有两种类型的存储引擎：事务性和非事务性。

对于 MySQL 5.5 和更高版本，默认存储引擎为 InnoDB。 5.5 版之前的 MySQL 默认存储引擎为 MyISAM。 选择正确的存储引擎是一项重要的战略决策，它将影响未来的发展。 在本教程中，我们将使用 MyISAM，InnoDB，内存和 CSV 存储引擎。 如果您不熟悉 MySQL，并且正在研究 MySQL 数据库管理系统，则不必担心。 如果您要计划生产数据库，那么事情将变得更加复杂。

## 存储引擎列表

MySQL 支持的存储引擎：

*   InnoDB
*   MyISAM
*   内存
*   CSV
*   合并
*   归档
*   联合
*   黑洞


_InnoDB_ 是使用最广泛的具有事务支持的存储引擎。 它是符合 ACID 的存储引擎。 它支持行级锁定，崩溃恢复和多版本并发控制。 它是唯一提供外键引用完整性约束的引擎。 Oracle 建议将 InnoDB 用于表，特殊用例除外。

_MyISAM_ 是原始存储引擎。 这是一个快速的存储引擎。 它不支持事务。 MyISAM 提供表级锁定。 它主要用于 Web 和数据仓库。

内存存储引擎在内存中创建表。 这是最快的引擎。 它提供表级锁定。 它不支持事务。 内存存储引擎非常适合创建临时表或快速查找。 重新启动数据库后，数据将丢失。

_CSV_ 将数据存储在 CSV 文件中。 它提供了极大的灵活性，因为这种格式的数据很容易集成到其他应用中。

合并对基础 MyISAM 表进行操作。 合并表有助于更轻松地管理大量数据。 它在逻辑上对一系列相同的 MyISAM 表进行分组，并将它们引用为一个对象。 适用于数据仓库环境。

归档存储引擎针对高速插入进行了优化。 插入时压缩数据。 它不支持事务。 它是存储和检索很少参考的历史，存档数据的理想选择。

黑洞存储引擎接受但不存储数据。 检索总是返回一个空集。 该功能可用于分布式数据库设计中，在该数据库中，数据将自动复制，但不会存储在本地。 该存储引擎可用于执行性能测试或其他测试。

联合存储引擎提供了将 MySQL 服务器分离以从许多物理服务器创建一个逻辑数据库的能力。 本地服务器上的查询将在远程（联合）表上自动执行。 没有数据存储在本地表上。 这对分布式环境很有用。

```sql
mysql> SHOW ENGINES\G
*************************** 1\. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 2\. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
...

```

`SHOW ENGINES`命令显示服务器支持的所有可用引擎。

## 选择合适的引擎

没有存储引擎在所有情况下都是理想的。 有些在某些条件下表现最佳，而在其他情况下则表现较差。 存在一些必须考虑的折衷。 一个更安全的解决方案会占用更多资源； 它可能会更慢，需要更多的 CPU 时间和磁盘空间。 MySQL 提供了多种不同的存储引擎，因此非常灵活。 其中一些文件（例如存档引擎）是为在特定情况下使用而创建的。

在某些情况下，答案很明确。 每当我们处理某些支付系统时，我们都有义务使用最安全的解决方案。 我们无法承受丢失此类敏感数据的风险。 InnoDB 是必经之路。 如果要全文搜索，则可以选择 MyISAM 或 InnoDB。只有 InnoDB 支持外键引用完整性约束，如果我们计划使用此约束，则选择很明确。

## 指定和更改存储引擎

在创建表时指定存储引擎。

```sql
mysql> CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name VARCHAR(50), 
    -> Cost INTEGER) ENGINE='MyISAM';

```

`ENGINE`关键字指定用于此特定表的存储引擎。

如果我们未明确指定存储引擎，则使用默认存储引擎。 在 MySQL 5.5 之前，默认存储引擎是 MyISAM。 对于 MySQL 5.5 及更高版本，默认存储引擎为 InnoDB。

可以迁移到其他存储引擎。 请注意，迁移大表可能需要很长时间。 另外，在迁移表时，我们可能会遇到一些问题。 这两个表可能不支持某些功能。

```sql
mysql> SELECT ENGINE FROM information_schema.TABLES
    -> WHERE TABLE_SCHEMA='mydb'
    -> AND TABLE_NAME='Cars';
+--------+
| ENGINE |
+--------+
| InnoDB |
+--------+
1 row in set (0,05 sec)

```

该 SQL 语句在`mydb`数据库中找出用于`Cars`表的存储引擎。 我们也可以使用`SELECT CREATE TABLE Cars` SQL 语句。 `information_schema`是存储有关我们表的技术信息的表。

```sql
mysql> ALTER TABLE Cars ENGINE='MyISAM';

```

该 SQL 语句将`Cars`表的存储引擎更改为 MyISAM。

```sql
mysql> SELECT ENGINE FROM information_schema.TABLES
    -> WHERE TABLE_SCHEMA='mydb'
    -> AND TABLE_NAME='Cars';
+--------+
| ENGINE |
+--------+
| MyISAM |
+--------+
1 row in set (0,00 sec)

```

现在，表的存储引擎是 MyISAM。

在 MySQL 教程的这一部分中，我们介绍了存储引擎。