2012-08-01 52 views
7

讓我們有一個簡單的產品表。每個產品都有其獨特的ID和類別。用戶經常按類別搜索,因此我想按類別對產品進行分區。一個分區中的每個類別如何按不在唯一索引中的列對MySQL表進行分區

我該怎麼做?因爲我當然在我的ID列上有一個主鍵,並且需要我的唯一ID。在每個類別中不是唯一的。

但是partitiong有這樣的限制:「表上的每個唯一鍵必須使用表的分區表達式中的每一列」。

那麼,這不會使分區有點沒用?或者我錯過了什麼?我該怎麼辦?

http://dev.mysql.com/doc/refman/5.1/en/partitioning-limitations-partitioning-keys-unique-keys.html

回答

10

訣竅是外地category添加到您當前的主鍵。 (您的主鍵將保持爲主鍵)
然後您可以按類別對錶進行分區。

這裏是你可以使用代碼:

ALTER TABLE `products` DROP PRIMARY KEY , ADD PRIMARY KEY (`id` , `category`); 
ALTER TABLE `products` PARTITION BY KEY(category) PARTITIONS 6; 

添加auto_increment選項標識,如果你希望它是真正獨一無二的,當你在表中插入數據不指定id的值。插入時,數據庫服務器將確定該id。

如有必要,更改字段名稱和密鑰名稱。

文檔:然後
Partitioning types
KEY Partioning

+0

當然,但ID不會是唯一的,但在類只有唯一的,這是我不想要的。 Replace Into將停止工作。如果產品類別改變,產品將被複制。但無論如何,謝謝你的回答。 – 2012-08-02 07:57:59

+0

不可以。將字段添加到主鍵無法使其成爲non_unique,正如我在答案中所寫的那樣。你爲什麼不試試看它的工作原理?我已經在一個大的日誌表(2百萬到5百萬條記錄)上使用了這種分區方法:白天允許非常快速的SELECT,並且可以非常快速地刪除特定日期的所有記錄(只需刪除一個分區)。 – Jocelyn 2012-08-02 08:49:53

+0

哦,不,我知道PRIMARY KEY仍然是唯一的。但是現在僅僅是密鑰的一部分的ID將不再是唯一的,因爲類別列中的不同值可以使密鑰唯一,儘管ID將是相同的。但它看起來像MySQL就這樣工作(雖然它沒有多大意義),我將不得不忍受它。無論如何,感謝你的努力。 – 2012-08-03 08:52:13