MySQL 5 存储引擎

Tags: database mysql

MySQL5 的新存储引擎

MySQL 5 提供了一些新的存储引擎(以前称作表类型)。除了默认的 MyISAM 、InnoDB、BDB、HEAP 以及 MERGE 存储引擎以外,还增加了 4 种新的类型:CSV、ARCHIVE\FEDERATED 和 EXAMPLE, 以及 HEAP 存储引擎的新名字,现在它称作 MEMORY 存储引擎。任何一个新的类型都不是默认的存储引擎,你可以使用 SHOW ENGINES 语句检查可用的存储引擎,下面是我的 MySQL Max 默认版上的输出结果:

mysql> SHOW ENGINES;
+------------+---------+------------------------------------------------------------+
| Engine     | Support | Comment                                                    |
+------------+---------+------------------------------------------------------------+
| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     |
| HEAP       | YES     | Alias for MEMORY                                           |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  |
| MERGE      | YES     | Collection of identical MyISAM tables                      |
| MRG_MYISAM | YES     | Alias for MERGE                                            |
| ISAM       | NO      | Obsolete storage engine, now replaced by MyISAM            |
| MRG_ISAM   | NO      | Obsolete storage engine, now replaced by MERGE             |
| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys |
| INNOBASE   | YES     | Alias for INNODB                                           |
| BDB        | YES     | Supports transactions and page-level locking               |
| BERKELEYDB | YES     | Alias for BDB                                              |
| NDBCLUSTER | NO      | Clustered, fault-tolerant, memory-based tables             |
| NDB        | NO      | Alias for NDBCLUSTER                                       |
| EXAMPLE    | NO      | Example storage engine                                     |
| ARCHIVE    | NO      | Archive storage engine                                     |
| CSV        | NO      | CSV storage engine                                         |
+------------+---------+------------------------------------------------------------+

如果要增加未支持的存储引擎,你当前需要使用特定的选项重新编译 MySQL。虽然在后续可能会发布默认支持这些存储引擎的版本,不过现在,只能通过重新编译来启用他们。

变更到 MEMORY 存储引擎

你可以通过阅读MySQL 表类型 -- HEAP 表类型来初步了解,因为大部分的细节没有改变,下面将介绍 MySQL 5 中所做的一些调整。

之前,HEAP 存储引擎仅使用 hash 索引,这可以快速找打特定的匹配项,不过无法通过范围检索数据。一条索引可以匹配一行记录,但是无法返回后续的记录集,只能通过完全索引实现,最左前缀 (使用索引的左侧部分)并不适用。MEMORY 存储引擎目前可以使用 BTREE 索引(MyISAM 默认使用的索引算法)。

要指定索引类型,需要使用 USING 子句,比如下面例子:

CREATE TABLE memory_table (f1 INT, INDEX USING BTREE (f1)) ENGINE = MEMORY;

或者

CREATE TABLE memory_table (f1 INT, INDEX USING HASH (f1)) ENGINE = MEMORY;

如果不指定其他索引类型,那么 HASH 索引目前仍然是默认的索引类型。

  • 现在已支持 AUTO_INCREMENT

  • 现在已经支持 INSERT DELAYED

  • 支持卡可以包含 NULL 值的按列索引

  • 不会转换到硬盘上。Temporary internam tables 如果太大了会被自动转换到硬盘上,不过 MEMORY 表从来不会。变量 max_heap_table_size (新存储引擎并未修改这个变量名)可以限制 MEMORY 表的内存使用量,并且你也可以在创建表的时候使用 MAX_ROWS 进行限制。

EXAMPLE 存储引擎

自 MySQL 4.1.3 引入,并且仅面向开发者,EXAMPLE 存储引擎没有任何功能,不过它提供了基础的源码,这样开发人员可以依据它创建新的存储引擎。源代码可以在 sql/examples 目录找到。

FEDERATED 存储引擎

MySQL 5.0.3 引入,你需要在编译 MySQL 时使用 --with-federated-storage-engine 选项来启动它。FEDERATED 存储引擎允许你访问数据在其他数据库服务器上的表,远程服务器上的表可以使用任何存储引擎。让我们通过实际的例子看看,首先,在远程服务器上创建一张表(你可以在同一个服务器上进行测试,不过除了测试以外没有太大意义)

CREATE TABLE myisam_table (f1 INT, PRIMARY KEY(f1)) 
ENGINE=MYISAM;

假设默认创建 MyISAM 表(FEDERATED 可以访问任何类型的表),上面的语句创建了定义文件(.frm),以及索引文件(.MYI)以及数据文件(.MYD)。如果你创建了 InnoDB 表,MySQL 会创建定义文件爱你(.frm)以及索引和数据文件(.idb)。现在在另一个服务器上创建 FEDERATED 表,原表必须已经存在:

CREATE TABLE federated_table (f1 INT, PRIMARY KEY(f1)) 
ENGINE=FEDERATED 
COMMENT='mysql://username:password@hostname.co.za:3306/dbname/myisam_table';

上面的语句创建了定义文件(.frm),不过表的数据和索引在远程服务器上。其中有一个不太常用的语法是 COMMENT, 它提供了用户名、密码(可选)、端口(可选),数据库以及表名。这个方法不是很优雅以及安全,由于密码被保存在纯文本中并且任何人都可以访问表数据。然 而,在大多数情况下,等访问 FEDERATED 表的人同样可以访问远程表,因此这个不是太呆的问题。需要注意的是,这个连接方法在后续版本中可能会被调整。

FEDERATED 表的使用有一些限制,通过它可以很容易的访问其他服务器上的数据,不过在其他一些方面存在短板:

  • 不能使用数据定义语句(比如:DROP TABLE, ALTER TABLE)

  • 这些表不支持事务(由于仅连接一次远程服务器,并且数据会返回到本地服务器)

  • 同样的,无法确保本地数据的完整性

  • 不能使用 prepared statements

CSV 存储引擎

在 MySQL 4.1.4 引入,CSV 表实际上就是 逗号分隔的文本文件。它的存在使得 MySQL 可以很容易使用它与其他应用程序交互,比如电子表格软件。这种存储引擎没有使用任何类型的索引。要使用这种存储引擎,需要在编译 MySQL 时使用 --with-csv-storage-engine 编译选项。

让我们看看它如何工作的,你可以导入一个已存在的 CSV 文件。假设你有一个包含 firtname、surname 以及 age,比如:

"Jacob","Mbezela","42"
"Schabir","Field","29"

首先创建 .frm 定义文件:

mysql> CREATE TABLE csv_names(firstname CHAR(30), surname CHAR(40), age INT) ENGINE = CSV;

空的数据文件被创建了。由于 CSV 文件仅仅是纯文本文件,你可以拷贝已存在的 CSV 文件到相同的位置,这个文件就可以被 MySQL 客户端使用了,比如:

mysql> SELECT * FROM csv_names;
+-----------+------------+-----+
| firstname | surname    | age |
+-----------+------------+-----+
| Jacob     | Mbezela    |  42 |
| Schabir   | Field      |  29 |

由于没有索引,SELECT 语句效率不高,因为需要执行全表扫描。相似的,你可以通过 MySQL 客户端 INSERT 一条记录:

mysql> INSERT INTO csv_names VALUES('Quinton','Baxter','75');

我们看看 CSV 文件的变化:

"Jacob","Mbezela","42"
"Schabir","Field","29"
"Quinton","Baxter","75"

ARCHIVE 存储引擎

自 MySQL 4.1.3 引入,就如它的名字所暗示的,它可以使用尽可能小的空间来保存很大的数据。它同样没有使用任何类型的索引,不过它是表被损坏时修复表最好的方式。要启用这个存储引擎,需要在编译 MySQL 是使用 --with-archive-storage-engine 编译选项

mysql> CREATE TABLE archive_names(firstname CHAR(30), surname CHAR(40), age INT) ENGINE = ARCHIVE;

上面语句会创建 .frm 定义文件,以及 .ARZ 和 .ARM 数据文件以及元数据文件。

归档后,你不能 DELETEUPDATE 或者 REPLACE 记录,你仅能够 INSERTSELECT 记录。注意,由于没有索引,SELECT 语句执行的是全表扫描。虽然记录在插入后会被压缩,OPTIMIZE TABLE 仍然可以更进一步压缩整个数据集,当执行压缩时会生成 .ARN 文件。

mysql> INSERT INTO archive_name VALUES('Quinton','Baxter','75');

mysql> SELECT * FROM archive_names;
+-----------+------------+-----+
| firstname | surname    | age |
+-----------+------------+-----+
| Quinton   | Baxter     |  75 |
+-----------+------------+-----+

结论

这些新的存储引擎,会让大多数用户感觉棘手,因为需要重新编译 MySQL,不过对于特殊的需求他们非常有用。毕竟,人们花费的很多时间来创造它们!它们在同一个发布版中被引入,因此,如果你希望尝试使用他们,但又不 希望重新编译 MySQL,那么你只能耐心等待了。即便你现在可以使用它们,一定要关注官方文档,因为在这些技术成熟时可能会有一些改变。祝你好运!

本文链接:http://www.4byte.cn/learning/37779/mysql-5-cun-chu-yin-qing.html



相关文章