18.7.2 MERGE 表问题
以下是MERGE表的已知问题:
-
在MySQL Server版本之前的5.1.23,可能创建临时合并表具有非临时子MyISAM表。
从版本5.1.23开始,MERGE子表被锁定通过父表。如果父表是临时的,它不会被锁定,因此子表也不会被锁定。并发使用MyISAM表会损坏它们。
-
如果使用
ALTER TABLE将MERGE表更改为另一种存储引擎,映射到 underlying 表的信息将被丢失。相反,来自underlying MyISAM 表的行将被复制到已更改的表中,该表然后使用指定的存储引擎。 -
MERGE表的INSERT_ METHOD选项指示哪个underlying MyISAM 表用于将数据插入到MERGE表中。然而,对于该MyISAM 表使用AUTO_INCREMENT选项对插入到MERGE表中的行没有影响,直到至少有一行直接插入到MyISAM 表中。 -
MERGE 表不能维护整个表的唯一约束。当您执行
INSERT时,数据将被写入到第一个或最后一个MyISAM 表(根据INSERT_ METHOD选项)。MySQL 确保在该MyISAM 表中唯一键值保持唯一,但不跨越整个表的所有 underlying 表。 -
由于 MERGE 引擎不能对 underlying 表集强制执行唯一约束,
REPLACE无法按预期工作。两个关键事实是:类似的考虑也适用于
INSERT ... ON DUPLICATE KEY UPDATE。 -
MERGE表不支持分区。也就是说,你不能对一个MERGE表进行分区,也不能对该表的 underlyingMyISAM表进行分区。 -
你 shouldn't 使用
ANALYZE TABLE、REPAIR TABLE、OPTIMIZE TABLE、ALTER TABLE、DROP TABLE、DELETEwithout aWHEREclause,或者TRUNCATE TABLE在任何映射到一个打开的MERGE表中的表上。 如果你这样做,MERGE表可能仍然引用原始表并产生意外结果。要解决这个问题,请在执行任何命名操作之前确保没有打开的MERGE表存在,可以通过发出FLUSH TABLES语句来实现。出现的意外结果可能是对MERGE表的操作报告表 Corruption。如果在MyISAM表下层的一些命名操作后发生这种情况,Corruption信息是虚假的。要解决这个问题,可以在修改MyISAM表后执行一个FLUSH TABLES语句。
-
DROP TABLE对一个由MERGE表使用的表无效,因为MERGE存储引擎的表映射被隐藏在 MySQL 的上层。Windows 不允许打开文件被删除,因此您首先必须刷新所有MERGE表(使用FLUSH TABLES)或删除MERGE表,然后才能删除该表。
-
当访问表时(例如,在
SELECT或INSERT语句中),MyISAM 表和 MERGE 表的定义将被检查。检查确保表的定义和父 MERGE 表的定义相符,通过比较列顺序、类型、大小和关联索引。如果表之间存在差异,将返回错误语句失败。由于这些检查在打开表时发生,对于单个表的更改,包括列更改、列顺序更改和引擎更改都会导致语句失败。 -
MERGE 表及其 underlying 表中的索引顺序应该相同。如果使用
ALTER TABLE将 UNIQUE 索引添加到 MERGE 表中,然后使用ALTER TABLE将非唯一索引添加到 MERGE 表中,但是在 underlying 表中已经存在非唯一索引时,索引顺序不同(因为ALTER TABLE将 UNIQUE 索引置于非唯一索引前,以便快速检测重复键)。因此,对于具有这样的索引的表,查询可能返回意外结果。 -
如果您遇到类似于ERROR 1017 (HY000): Can't find file: '
tbl_名.MRG' (errno: 2)的错误消息,这通常表明一些 underlying 表不使用MyISAM存储引擎。请确认这些表都使用MyISAM。 -
一个
MERGE表的最大行数是264(~1.844E+19;与MyISAM表相同)。不能将多个MyISAM表合并到一个MERGE表中,该表将有更多的行。 -
当前使用不同行格式的 underlying
MyISAM表作为父MERGE表的子表是已知的失败。请参阅 Bug #32364。 -
在
LOCK TABLES生效时,您不能更改一个非临时MERGE表的合并列表。以下不起作用:CREATE TABLE m1 ... ENGINE=MRG_MYISAM ...; LOCK TABLES t1 WRITE, t2 WRITE, m1 WRITE; ALTER TABLE m1 ... UNION=(t1,t2) ...;然而,您可以使用临时MERGE表来实现这点。 -
您不能使用CREATE ... SELECT创建一个MERGE表,既不是临时MERGE表,也不是非临时MERGE表。例如:CREATE TABLE m1 ... ENGINE=MRG_MYISAM ... SELECT ...;尝试这样做将导致错误:tbl_名不是BASE TABLE。 -
在某些情况下,
MERGE表和 underlying 表之间的PACK_KEYS表选项值不同,如果underlying 表包含CHAR或BINARY列可能会出现意外结果。作为解决方案,可以使用ALTER TABLE确保所有相关表都具有相同的PACK_KEYS值。 (Bug #50646)