多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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 教程的这一部分中,我们介绍了存储引擎。