分区具有外键的mySQL表?

时间:2010-03-22 22:10:14

标签: mysql foreign-keys partitioning

这样做的合适方法是什么,因为mySQL显然不喜欢这个。 从数据库设计中留下分区或外键对我来说似乎不是一个好主意。我猜这有一个解决方法吗?

更新03/24:

http://opendba.blogspot.com/2008/10/mysql-partitioned-tables-with-trigger.html

How to handle foreign key while partitioning

谢谢!

2 个答案:

答案 0 :(得分:2)

我强烈建议使用Date作为归档数据归档表的关键字。如果需要报告多个归档表,可以使用视图,或在应用程序中构建逻辑。

但是,使用结构合理的数据库,您应该能够在分区之前处理表中数千万行,或者确实需要分片。

答案 1 :(得分:2)

这取决于分区表中行的大小是否需要分区的原因。

如果行大小很小且分区的原因是行的纯粹数,那么我不确定你应该做什么。

如果行大小很大,那么您是否考虑过以下内容:

P为分区表,F为be-be外键中引用的表。创建一个新表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

并且至关重要的是,创建一个用于向表P添加行的存储过程。您的存储过程应该确定(使用事务),每当向表P添加行时,相应的行将添加到表X。您不得以“正常”方式将行添加到P!如果继续使用存储过程添加行,则只能保证将保留参照完整性。不过,您可以通过正常方式自由地从P删除。

这里的想法是你的表X有足够小的行,你应该不需要对它进行分区,即使它有很多行。不过,我猜这个表上的索引会占用相当大的一块内存。

如果您需要在外键上查询P,您当然会查询X,因为这是外键的实际位置。