2009-01-07 58 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,這看起來有一些非常有用的功能,用於分片和複製數據庫。無論如何,感謝您的意見,在作出決定之前,我必須多讀一點。