2009-01-07 60 views
2

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

现在,我想要一个自动递增的'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))" 

在那里我有“身份证”和“TASK_ID”列组成的主键,我没有做任何事情特别是ActiveRecord模式,我是否为未来的任何头痛而设置自己?

基本上,我创建一个表基于两列的主键,但没有告诉ActiveRecord的关于第二列,因为我仍然有一个自动递增的ID字段 - 任何人都可以看到使用这种方法的任何问题?

回答

2

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

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

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

0

虽然不完全是你在找什么,作为替代你见过吗DataFabric? 这是一种在多个数据库中分解数据的应用程序级别的方法。它还为您提供了一种使用主从复制的方法。就像我说的,与数据库级分区不完全相同,但似乎更容易实现。

0

好的,谢谢你的评论。是的,我一直在看DataFabric,这看起来有一些非常有用的功能,用于分片和复制数据库。无论如何,感谢您的意见,在作出决定之前,我必须多读一点。