使用 ActiveRecord 进行 MySQL 分区

标签 mysql ruby-on-rails database database-design activerecord

我想利用 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/

相关文章:

mysql - 在存储过程中循环准备语句查询的结果

php - 如何从页面上的mysql和echo链接获取数据?

ruby-on-rails - Ruby on Rails 应用程序应该消耗多少内存?

ruby-on-rails - 在 Rails 引擎中使用另一个 gem 的 javascript

mysql - 缺月补零

ruby-on-rails - 将 JSON 响应压缩为 zip 并下载当用户在 Rails 中点击 h URL 时

mysql - mysql数据库中查询join/select

sql - sql 查询中的 Max()

mysql - 如何使用SQL在一个数据库中搜索与另一个数据库中的值匹配的值

mysql - 选择给定日期范围内的可用房间