Разделение MySQL с ActiveRecord - PullRequest
       15

Разделение MySQL с ActiveRecord

2 голосов
/ 07 января 2009

Я хочу воспользоваться новым разделением в 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 о втором столбце, поскольку у меня все еще есть поле идентификатора с автоинкрементом. Может кто-нибудь увидеть какие-либо проблемы с этим подходом?

Ответы [ 3 ]

2 голосов
/ 07 января 2009

Полагаю, то, что вы описываете, создаст модель ActiveRecord, а затем изменит ее непосредственно в MySQL. Возможный недостаток в том, что Rails не будет знать о 'task_id' и, конечно, не будет включать его в запросы. Проблема заключается в том, что основным преимуществом секционирования является оптимизатор запросов, который будет видеть, что запрос включает "task_id = 7", и знает, что запрос необходимо выполнить только во втором разделе.

Вы по-прежнему должны видеть некоторые преимущества, поскольку объединения (в частности, из таблицы задач) включают этот ключ, и оптимизатор запросов может делать правильные вещи.

Rails / Active Record также имеет привычку обновлять каждый столбец независимо от того, изменился ли он. MySQL обычно замечает, что вы обновляете столбец до того значения, которое уже было - но следите за этим, потому что, если MySQL считает, что ему нужно переместить запись из одного раздела в другой, ваши обновления получат удар.

0 голосов
/ 08 января 2009

ОК, спасибо за ваши комментарии. Да, я изучал DataFabric, и похоже, что в нем есть довольно полезные функции для разделения и репликации баз данных. В любом случае, спасибо за вклад, мне придется еще немного прочитать, прежде чем принимать решение.

0 голосов
/ 08 января 2009

Хотя не совсем то, что вы ищете, в качестве альтернативы вы видели DataFabric? Это способ применения данных на уровне приложений для нескольких баз данных. Это также дает вам возможность использовать master-> slave replication. Как я уже сказал, не совсем то же самое, что разделение на уровне базы данных, но кажется, что это будет легче реализовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...