MySql 数据引擎简介与选择方法,和字节跳动大佬的技术面谈
·???????? NDB Cluster 是被 MySQL Cluster 用来实现分割到多台计算机上的表的存储引擎。它在 MySQL-Max 5.1 二进制分发版里提供。这个存储引擎当前只被 Linux, Solaris, 和 Mac OS X 支持。在未来的 MySQL 分发版中,我们想要添加其它平台对这个引擎的支持,包括 Windows。
·???????? ARCHIVE 存储引擎被用来无索引地,非常小地覆盖存储的大量数据。
·???????? CSV 存储引擎把数据以逗号分隔的格式存储在文本文件中。
·???????? BLACKHOLE 存储引擎接受但不存储数据,并且检索总是返回一个空集。
·???????? FEDERATED 存储引擎把数据存在远程数据库中。在 MySQL 5.1 中,它只和 MySQL 一起工作,使用 MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。
插件式存储引擎体系结构提供了标准的管理和支持服务集合,它们对所有的基本存储引擎来说是共同的。存储引擎本身是数据库服务器的组件,负责对在物理服务器层面上维护的基本数据进行实际操作。
这是一种高效的模块化体系结构,它为那些希望专注于特定应用需求的人员提供了巨大的便利和益处,这类特殊应用需求包括数据仓储、事务处理、高可用性情形等,同时还能利用独立于任何存储引擎的一组接口和服务。
应用程序编程人员和 DBA 通过位于存储引擎之上的连接器 API 和服务层来处理 MySQL 数据库。如果 应用程序的变化需要改变底层存储引擎,或需要增加 1 个或多个额外的存储引擎以支持新的需求,不需要进行大的编码或进程更改就能实现这类要求。MySQL 服 务器体系结构提供了一致和易于使用的 API,这类 API 适用于多种存储引擎,通过该方式,该结构将应用程序与存储引擎的底层复杂性隔离开来。
在下图中,以图形方式介绍了 MySQL 插件式存储引擎体系结构:
二、选择存储引擎
与 MySQL 一起提供的各种存储引擎在设计时考虑了不同的使用情况。为了更有效地使用插件式存储体系结构,最好了解各种存储引擎的优点和缺点。
在下面的表格中,概要介绍了与 MySQL 一起提供的存储引擎:
下述存储引擎是最常用的:
·???????? MyISAM:默认的 MySQL 插件式存储引擎,它是在 Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改 STORAGE_ENGINE 配置变量,能够方便地更改 MySQL 服务器的默认存储引擎。
·???????? InnoDB:用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。
·???????? BDB:可替代 InnoDB 的事务引擎,支持 COMMIT、ROLLBACK 和其他事务特性。
·???????? Memory:将所有数据保存在 RAM 中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
·???????? Merge:允许 MySQL DBA 或开发人员将一系列等同的 MyISAM 表以逻辑方式组合在一起,并作为 1 个对象引用它们。对于诸如数据仓储等 VLDB 环境十分适合。
·???????? Archive:为大量很少引用的历史、归档、或安全审计信息的存储和检索提供了完美的解决方案。
·???????? Federated:能够将多个分离的 MySQL 服务器链接起来,从多个物理服务器创建一个逻辑数据库。十分适合于分布式环境或数据集市环境。
·?????
??? Cluster/NDB:MySQL 的簇式数据库引擎,尤其适合于具有高性能查找要求的应用程序,这类查找需求还要求具有最高的正常工作时间和可用性。
·???????? Other:其他存储引擎包括 CSV(引用由逗号隔开的用作数据库表的文件),Blackhole(用于临时禁止对数据库的应用程序输入),以及 Example 引擎(可为快速创建定制的插件式存储引擎提供帮助)。
请记住,对于整个服务器或方案,你并不一定要使用相同的存储引擎,你可以为方案中的每个表使用不同的存储引擎,这点很重要。
三、将存储引擎指定给表
可以在创建新表时指定存储引擎,或通过使用 ALTER TABLE 语句指定存储引擎。
要想在创建表时指定存储引擎,可使用 ENGINE 参数:
CREATE TABLE engineTest(
id INT
) ENGINE = MyISAM;
也可以使用 TYPE 选项到 CREATE TABLE 语句来告诉 MySQL 你要创建什么类型的表。
CREATE TABLE engineTest(
id INT
) TYPE = MyISAM;
虽然 TYPE 仍然在 MySQL 5.1 中被支持,现在 ENGINE 是首选的术语。
如果你省略掉 ENGINE 或 TYPE 选项,默认的存储引擎被使用。一般的默认是 MyISAM,但 你可以用--default-storage-engine 或--default-table-type 服务器启动选项来改变它,或者通过设置 storage_engine 或 table_type 系统变量来改变。
要想更改已有表的存储引擎,可使用 ALTER TABLE 语句:
ALTER TABLEengineTestENGINE =ARCHIVE;
ALTER TABLE t ENGINE = MYISAM;
ALTER TABLE t TYPE = BDB;
如果你试着使用一个未被编译进 MySQL 的存储引擎,或者试着用一个被编译进 MySQL 但没有被 激活的存储引擎,MySQL 取而代之地创建一个 MyISAM 类型的表。当你在支持不同存储引擎的 MySQL 服务器之间拷贝表的时候,上述的行为是很方便 的。(例如,在一个复制建立中,可能你的主服务器为增加安全而支持事务存储引擎,但从服务器为更快的速度而仅使用非事务存储引擎。)
在不可用的类型被指定时,自动用 MyISAM 表来替代,这会对 MySQL 的新用户造成混淆。无论何时一个表被自动改变之时,产生一个警告。
MySQL 总是创建一个.frm 文件来保持表和列的定义。表的索引和数据可能被存储在一个或多个文件里,这取决于表的类型。服务器在存储引擎级别之上创建.frm 文件。单独的存储引擎创建任何需要用来管理表的额外文件。
一个数据库可以包含不同类型的表。
四、存储引擎和事务
下述存储引擎支持事务:
·???????? InnoDB:通过 MVCC 支持事务,允许 COMMIT、ROLLBACK 和保存点。
·???????? NDB:通过 MVCC 支持事务,允许 COMMIT 和 ROLLBACK。
·???????? BDB:支持事务,允许 COMMIT 和 ROLLBACK。
事务安全表(TST) 比起非事务安全表 (NTST)有几大优势:
·???????? 更安全。即使 MySQL 崩溃或遇到硬件问题,要么自动恢复,要么从备份加事务日志恢复,你可以取回数据。
·???????? 你可以合并许多语句,并用 COMMIT 语句同时接受它们全部(如果 autocommit 被禁止掉)。
·???????? 你可以执行 ROLLBACK 来忽略你的改变(如果 autocommit 被禁止掉)。
·???????? 如果更新失败,你的所有改变都变回原来。(用非事务安全表,所有发生的改变都是永久的)。
·???????? 事务安全存储引擎可以给那些当前用读得到许多更新的表提供更好的部署。
非事务安全表自身有几个优点,因为没有事务开支,所有优点都能出现:
·???????? 更快
·???????? 需要更少的磁盘空间
·???????? 执行更新需要更少的内存
你可以在同一个语句中合并事务安全和非事务安全表来获得两者最好的情况。尽管如此,在 autocommit 被禁止掉的事务里,变换到非事务安全表依旧即时提交,并且不会被回滚。
评论