17.9. MySQL簇发展的重要历程
- 17.9.1. MySQL 5.0中的MySQL簇变化
- 17.9.2. 关于MySQL簇的MySQL 5.1发展历程
在本节,我们讨论了MySQL 5.1在MySQL簇实施中的一些变化,并与MySQL 5.0进行了比较。我们还将讨论对MySQL簇的进一步重大改进,目前是为MySQL 5.2规划的。
在MySQL 5.0和5.1中,NDB簇存储引擎实施方案之间的变化相对较少,因此其升级相对快捷和简单。
为MySQL簇开发的主要新特性均归入了MySQL 5.1树。在本节中,我们还提供了一些提示,介绍了在MySQL 5.1中簇特性可能包含的方面(请参见17.9.2节,“关于MySQL簇的MySQL 5.1发展历程”)。
17.9.1. MySQL 5.0中的MySQL簇变化
MySQL 5.0.3-beta以及更新的版本包含一些有趣的新特性:
·下推条件:一种查询,如:
·SELECT * FROM t1 WHERE non_indexed_attribute = 1;
它将使用全表扫描,并会在簇的数据节点内评估条件。因此,不需要在网络中发送用于评估的记录(也就是说,采用函数传输而不是数据传输)。对于这种查询类型,其速度快5~10倍。请注意,模目前该特性是默认禁止的(有待更彻底的测试),但在某些情况下也能良好工作。使用命令“SET engine-condition-pushdown=On; command”可启用该特性。作为可选方式,你也可以用新的“--engine-condition-pushdown”选项标志启动MySQL服务器,运行启用了该特性的mysqld。
可以使用EXPLAIN来判定在何时使用了下推条件。
该变化的一项主要优点在于,能够以并行方式执行查询。这意味着,与以往相比,对非索引列的查询要快5~10倍,乘以数据节点的数目。原因在于,多个CPU能以并行方式执行查询。
·降低了IndexMemory使用:在MySQL 5.1中,每条记录约消耗25字节的索引内存,每个唯一索引每记录将使用25字节的索引内存(不含某些数据内存,这是因为它们保存在单独表中)。这是因为在索引内存中,不再需要保存主键。
·为MySQL簇启用了查询高速缓冲:关于配置和使用查询高速缓冲的更多信息,请参见5.13节,“MySQL查询高速缓冲”。
·新的优化:有一个需要给予特别关注的优化,即,目前在某些查询中使用了批式读取接口。例如,考虑下述查询:
·SELECT * FROM t1 WHERE primary_key IN (1,2,3,4,5,6,7,8,9,10);
与以往的MySQL簇版本相比,该查询的执行速度快2~3倍,原因在于,全部10个键查找是在1个批次中发出的,而不是一次发送一个。
·限制元数据对象的数目:在MySQL 4.1中,每个簇数据库最多可能包含1600个元数据对象,包括数据库表,系统表,索引和BLOB。在MySQL 5.0中,我们希望将该数值增加到20320。我们打算在2005年年中发布的MySQL 5.0.6 beta版中实现该增强特性。
17.9.2. 关于MySQL簇的MySQL 5.1发展历程
这里所介绍的内容是一份状态报告,它基于最近提交到MySQL 5.1源码树的内容。请注意,所有的5.1开发活动均可能随时变化。
目前,有四种为MySQL 5.1开发的主要新特性:
1. 将MySQL簇集成到了MySQL复制中:这样,就能从簇中的任何MySQL服务器执行更新,并由簇中的1个MySQL服务器处理MySQL复制,并保持了从服务器端安装的一致性。
2. 支持基于磁盘的记录:将支持磁盘上的记录。对于包含主键哈希索引的有索引字段,必须仍保存在RAM中,但可以将所有其他字段保存在磁盘上。
3. 大小可变的记录:定义为VARCHAR(255)的列目前使用260字节的存储空间,与任何特定记录中保存的内容无关。在MySQL 5.1簇表中,只保存被记录实际占用的字段部分。这样,在很多情况下,能够将这类列的空间需求量降低5倍。
4. 用户定义的分区功能:用户能够根据主关键的字段部分定义分区。MySQL服务器能够发现是否能将某些分区从WHERE子句中删除。能够根据KEY、HASH、RANGE和LIST处理程序执行分区操作和子分区操作。对于很多其他处理程序,也应能使用该特性。
此外,对于簇表中包含除BLOB或TEXT外的列类型的行,我们正准备增大8K的大小限制值。这是因为,行目前具有固定的大小,页大小为32768字节(减去用于行标题的128字节)。在目前,这意味着,如果允许每记录占用的大小超过8K,剩余的空间将为空(多达14000字节)。在MySQL 5.1中,我们打算更正该限制,从而使得在给定行中使用8K以上的空间不会导致页剩余部分的浪费。