什么是合适的方法来做到这一点,因为 mySQL 显然不喜欢这个。从数据库设计中排除分区或外键对我来说似乎不是一个好主意。我猜想有一个解决方法吗?
03/24 更新:
http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html
谢谢!
什么是合适的方法来做到这一点,因为 mySQL 显然不喜欢这个。从数据库设计中排除分区或外键对我来说似乎不是一个好主意。我猜想有一个解决方法吗?
03/24 更新:
http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html
谢谢!
我强烈建议使用 Date 作为将数据归档到归档表的键进行分片。如果您需要报告多个存档表,您可以使用视图,或将逻辑构建到您的应用程序中。
但是,使用结构合理的数据库,您应该能够在分区之前处理表中的数千万行,或者确实需要分片。
这取决于分区表中的行大小在多大程度上是需要分区的原因。
如果行大小很小并且分区的原因是行数,那么我不确定你应该做什么。
如果行大小很大,那么您是否考虑过以下问题:
让P
是分区表,F
是在可能的外键中引用的表。创建一个新表X
:
CREATE TABLE `X` (
`P_id` INT UNSIGNED NOT NULL,
-- I'm assuming an INT is adequate, but perhaps
-- you will actually require a BIGINT
`F_id` INT UNSIGNED NOT NULL,
PRIMARY KEY (`P_id`, `F_id`),
CONSTRAINT `Constr_X_P_fk`
FOREIGN KEY `P_fk` (`P_id`) REFERENCES `P`.`id`
ON DELETE CASCADE ON UPDATE RESTRICT,
CONSTRAINT `Constr_X_F_fk`
FOREIGN KEY `F_fk` (`F_id`) REFERENCES `F`.`id`
ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=INNODB CHARACTER SET ascii COLLATE ascii_general_ci
至关重要的是,创建一个用于向 table 添加行的存储过程P
。您的存储过程应该确保(使用事务)每当将一行添加到 table 时P
,就会将相应的行添加到 table X
。您不能允许以P
“正常”方式添加行!如果您继续使用存储过程来添加行,您只能保证将保持参照完整性。P
不过,您可以以正常方式自由删除。
这里的想法是你的表X
有足够小的行,即使它有很多行,你也不应该对其进行分区。我猜,表上的索引仍然会占用相当大的内存。
如果您需要查询P
外键,您当然会查询X
,因为那是外键实际所在的位置。