21.1.7.1 NDB 群集中不遵守 SQL 语法

某些与某些 MySQL 功能有关的 SQL 语句在与NDBtable 一起使用时会产生错误,如下 table 所示:

  • 临时 table. 不支持临时 table。尝试创建使用NDB存储引擎的临时 table 或更改现有的临时 table 以使用NDB失败,并显示错误 table 存储引擎“ ndbcluster”不支持创建选项“ TEMPORARY”。

  • NDBtable 中的索引和键. NDB 群集 table 中的键和索引受以下限制:

  • 列宽. 尝试在宽度大于 3072 字节的NDBtable 列上创建索引成功,但实际上仅前 3072 个字节用于索引。在这种情况下,警告“指定密钥”太长;发出最大密钥长度为 3072 字节,并且显示创建 table语句显示索引的长度为 3072.

    • TEXT 和 BLOB 列. 无法在使用TEXTBLOB数据类型的NDBtable 列上创建索引。

    • FULLTEXT 索引. NDB存储引擎不支持FULLTEXT索引,这仅适用于MyISAMInnoDBtable。

但是,您可以在NDB个 table 的VARCHAR列上创建索引。

  • 使用散列键和 NULL. 在唯一键和主键中使用可为空的列意味着将使用这些列的查询作为全 table 扫描来处理。要变通解决此问题,使列NOT NULL,或重新创建没有USING HASH选项的索引。

  • 前缀. 没有前缀索引;只有整个列都可以构建索引。 (如本节前面所述,NDB列索引的大小始终与列的宽度相同,以字节为单位,最大为 3072 字节,包括 3072 字节.另请参见第 21.1.7.6 节,“ NDB 群集中不支持或缺少的功能”。)

  • BIT 列. BIT列不能是主键,唯一键或索引,也不能是复合主键,唯一键或索引的一部分。

  • AUTO_INCREMENT 列. 与其他 MySQL 存储引擎一样,每个 tableNDB存储引擎最多可以处理AUTO_INCREMENT列。但是,在没有显式主键的 NDBtable 的情况下,会自动定义AUTO_INCREMENT列并将其用作“隐藏”主键。出于这个原因,您不能定义具有显式AUTO_INCREMENT列的 table,除非该列也使用PRIMARY KEY选项声明。尝试使用不是 table 主键的AUTO_INCREMENT列创建 table 并使用NDB存储引擎失败,并显示错误。

  • 对外键的限制. NDB 7.5 中对外键约束的支持与InnoDB所提供的支持相当,但受到以下限制:

  • 如果不是 table 的主键,则引用为外键的每一列都需要一个显式的唯一键。

    • 当引用是父 table 的主键时,不支持ON UPDATE CASCADE

这是因为主键的更新是通过删除旧行(包含旧主键)加上插入新行(带有新主键)来实现的。这对于NDB内核是不可见的,NDB内核将这两行视为相同,因此无法知道应将此更新级联。

  • 从 NDB 7.5.14 和 NDB 7.6.10 开始:如果子 table 包含一个或多个TEXTBLOB类型的列,则不支持ON DELETE CASCADE。 (缺陷#89511,错误#27484882)

  • 不支持SET DEFAULT。 (InnoDB也不支持。)

  • 可接受NO ACTION个关键字,但将其视为RESTRICT。 (也与InnoDB相同.)

  • 在 NDB Cluster 的早期版本中,当创建带有外键引用另一个 table 中索引的 table 时,有时即使索引中各列的 Sequences 不匹配也可以创建外键。并非总是在内部返回适当的错误。此问题的部分修复改善了大多数情况下内部使用的错误。但是,如果父索引是唯一索引,则这种情况仍然有可能发生。 (缺陷号 18094360)

  • 在 NDB 7.5.6 之前,使用ALTER TABLE添加或删除外键时,父 table 的元数据不会更新,这使得随后可以在父 table 上执行无效的ALTER TABLE语句。要变通解决此问题,添加或删除外键后立即在父 table 上执行显示创建 table;这将强制重新加载父级的元数据。

此问题已在 NDB 7.5.6 中修复。 (缺陷#82989,错误#24666177)

有关更多信息,请参见第 13.1.18.5 节“外键约束”第 1.8.3.2 节“外键约束”

  • NDB 群集和几何数据类型. NDBtable 支持几何数据类型(WKTWKB)。但是,不支持空间索引。

  • 字符集和二进制日志文件. 当前,ndb_apply_statusndb_binlog_indextable 是使用latin1(ASCII)字符集创建的。由于此 table 中记录了二进制日志的名称,因此在这些 table 中未正确引用使用非拉丁字符命名的二进制日志文件。这是一个已知问题,我们正在努力解决。错误 35226)

要变通解决此问题,命名二进制日志文件或设置任何--basedir--log-bin--log-bin-index选项时,请仅使用 Latin-1 字符。

  • 使用用户定义的分区创建 NDBtable. NDB Cluster 中对用户定义的分区的支持仅限于[+90+] KEY分区。在CREATE TABLE语句中对ENGINE=NDBENGINE=NDBCLUSTER使用其他任何分区类型都会导致错误。

可以覆盖此限制,但是在生产设置中不支持这样做。有关详细信息,请参见用户定义的分区和 NDB 存储引擎(NDB 群集)

默认分区方案. 默认情况下,所有 NDB 群集 table 都以KEY分区,并使用 table 的主键作为分区键。如果未为该 table 显式设置主键,则使用NDB存储引擎自动创建的“隐藏”主键。有关这些和相关问题的其他讨论,请参见第 22.2.5 节“密钥分区”

不允许会导致用户分区的NDBCLUSTERtable 不满足以下两个要求中的一个或两个的CREATE TABLEALTER TABLE语句是不允许的,并且失败并显示错误:

  • 该 table 必须具有显式主键。

  • 该 table 的分区 table 达式中列出的所有列都必须是主键的一部分。

exception. 如果使用空列列 table(即使用PARTITION BY [LINEAR] KEY())创建了用户分区的NDBCLUSTERtable,则不需要显式主键。

NDBCLUSTERtable 的最大分区数. 采用用户定义的分区时,可以为NDBCLUSTERtable 定义的最大分区数是每个节点组 8. (有关 NDB 群集节点组的更多信息,请参见第 21.1.2 节“ NDB 群集节点,节点组,副本和分区”

不支持 DROP PARTITION. 无法使用ALTER TABLE ... DROP PARTITIONNDBtable 中删除分区。 NDBtable 支持对ALTER TABLEADD PARTITIONREORGANIZE PARTITIONCOALESCE PARTITION的其他分区扩展,但是使用复制功能,因此未进行优化。参见第 22.3.1 节“ManagementRANGE 和 LIST 分区”第 13.1.8 节“ ALTER TABLE 语句”

  • 基于行的复制. 在 NDB Cluster 中使用基于行的复制时,不能禁用二进制日志记录。也就是说,NDB存储引擎将忽略sql_log_bin的值。

  • JSON 数据类型. NDB 7.5.2 和更高版本随附的mysqld中的NDBtable 支持 MySQL JSON数据类型。

NDBtable 最多可包含 3 JSON列。

NDB API 没有使用JSON数据的特殊规定,它仅将其视为BLOB数据。将数据处理为JSON必须由应用程序执行。

  • CPU 和线程信息 ndbinfotable. NDB 7.5.2 在ndbinfo信息数据库中添加了几个新 table,这些 table 按节点,线程 ID 和线程类型提供有关 CPU 和线程活动的信息。这些 table 在这里列出:

  • cpustat:提供每秒,每线程的 CPU 统计信息

    • cpustat_50ms:每 50ms 收集一次的每线程原始 CPU 统计数据

    • cpustat_1sec:每秒收集的原始每线程 CPU 统计数据

    • cpustat_20sec:每 20 秒收集一次的原始每线程 CPU 统计数据

    • threads:线程类型的名称和描述

有关这些 table 的更多信息,请参见第 21.5.14 节,“ ndbinfo:NDB 群集信息数据库”

  • 锁定信息 ndbinfotable. NDB 7.5.3 将新 table 添加到ndbinfo信息数据库中,以提供有关正在运行的 NDB 群集中的锁定和锁定尝试的信息。这些 table 在这里列出:

  • cluster_locks:正在 await 或持有锁的当前锁请求;此信息在调查停滞和死锁时可能很有用。类似于cluster_operations