2

我想利用 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 字段 - 任何人都可以看到这种方法有什么问题吗?

4

3 回答 3

2

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

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

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

于 2009-01-07T19:37:05.413 回答
0

虽然不完全是您正在寻找的东西,但作为替代方案,您见过DataFabric 吗? 这是一种跨多个数据库分片数据的应用程序级方式。它还为您提供了一种使用主->从复制的方法。就像我说的,与数据库级分区不完全相同,但似乎更容易实现。

于 2009-01-07T22:23:35.797 回答
0

好的,谢谢你的意见。是的,我一直在研究 DataFabric,它看起来有一些非常有用的功能,可用于分片和复制数据库。无论如何,感谢您的意见,在做出决定之前,我将不得不阅读更多内容。

于 2009-01-08T09:41:50.093 回答