gpt4 book ai didi

使用 ActiveRecord 进行 MySQL 分区

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:08 26 4
gpt4 key购买 nike

我想利用 MySQL 5.1 中的新分区,但使用标准的 ActiveRecord 模型。我遇到的问题是要使用分区,表上的主键必须包括分区函数中使用的列。 ( http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html )

现在,我想要一个自动递增的“id”字段(通常用作 Rails 中的主键),但我想使用另一列进行分区,在本例中为“task_id”。至关重要的是,我不想在我的 Rails 应用程序中使用复合主键。我的问题是:

如果我按如下方式设置表格:

"CREATE TABLE `annotations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`task_id` int(11) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`value` text,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`, `task_id`),
KEY `index_annotations_on_task_id` (`task_id`),
KEY `index_annotations_on_user_id` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
PARTITION BY RANGE(task_id)(
PARTITION 1_to_5 VALUES LESS THAN (6),
PARTITION 6_to_10 VALUES LESS THAN (11),
PARTITION 11_to_15 VALUES LESS THAN (16))"

我的主键由“id”和“task_id”列组成,而且我没有对 ActiveRecord 模型做任何特别的事情,我是否为将来的任何头痛做好了准备?

基本上,我正在创建一个包含基于两列的主键的表,但没有告诉 ActiveRecord 关于第二列的信息,因为我仍然有一个自动递增的 id 字段 - 任何人都可以看到这种方法有什么问题吗?

最佳答案

我相信您所描述的,创建 ActiveRecord 模型然后直接在 MySQL 中修改它是可行的。可能的缺点是 Rails 不知道“task_id”,当然不会将其包含在查询中。问题是分区的主要优点是查询优化器会看到查询包含“task_id = 7”并且知道查询只需要在第二个分区中运行。

您应该仍然看到一些优势,因为连接(特别是来自任务表)将包含此键,查询优化器可以做正确的事情。

Rails/Active Record 也有更新每一列的习惯,无论它是否发生变化。 MySQL 通常会注意到您正在将列更新为它已经存在的值 - 但请注意这一点,因为如果 MySQL 认为它需要将记录从一个分区移动到另一个分区,您的更新将会受到影响。

关于使用 ActiveRecord 进行 MySQL 分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419857/

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