gpt4 book ai didi

mysql - 对具有外键的 mySQL 表进行分区?

转载 作者:可可西里 更新时间:2023-11-01 07:06:44 25 4
gpt4 key购买 nike

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

03/24 更新:

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

How to handle foreign key while partitioning

谢谢!

最佳答案

这取决于分区表中行的大小在多大程度上是需要分区的原因。

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

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

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

最重要的是,创建一个存储过程来向表 P 添加行。您的存储过程应该确保(使用事务)无论何时向表 P 添加一行,都会将相应的行添加到表 X。您不能允许以“正常”方式将行添加到 P!如果您继续使用存储过程来添加行,您只能保证参照完整性将得到维护。不过,您可以按照正常方式从 P 中自由删除。

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

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

关于mysql - 对具有外键的 mySQL 表进行分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2496140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com