MySQL 存储引擎
原文: 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 服务器分离以从许多物理服务器创建一个逻辑数据库的能力。 本地服务器上的查询将在远程(联合)表上自动执行。 没有数据存储在本地表上。 这对分布式环境很有用。
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 支持外键引用完整性约束,如果我们计划使用此约束,则选择很明确。
指定和更改存储引擎
在创建表时指定存储引擎。
mysql> CREATE TABLE Cars(Id INTEGER PRIMARY KEY, Name VARCHAR(50),
-> Cost INTEGER) ENGINE='MyISAM';
ENGINE
关键字指定用于此特定表的存储引擎。
如果我们未明确指定存储引擎,则使用默认存储引擎。 在 MySQL 5.5 之前,默认存储引擎是 MyISAM。 对于 MySQL 5.5 及更高版本,默认存储引擎为 InnoDB。
可以迁移到其他存储引擎。 请注意,迁移大表可能需要很长时间。 另外,在迁移表时,我们可能会遇到一些问题。 这两个表可能不支持某些功能。
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
是存储有关我们表的技术信息的表。
mysql> ALTER TABLE Cars ENGINE='MyISAM';
该 SQL 语句将Cars
表的存储引擎更改为 MyISAM。
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 教程的这一部分中,我们介绍了存储引擎。