2017-09-12 31 views
0

我有一個大約2Mln記錄的表,我想分割它。MySQL的分區 - 主鍵和唯一記錄的錯誤

我把id列作爲PRIMARY AUTO_INCREMENT int(它必須始終是UNIQUE)。 我有一列「他們」int(4),我想從2016年到2050年劃分BY RANGE,因爲大多數查詢使用WHERE語句獲得1年的時間。

進行分區我得到一個錯誤,說「heear」鍵必須與PRIMARY KEY一致,所以我編輯了執行多列鍵PRIMARY(id,theyear)的主鍵。

這一切OK,但我的「ID」列不是唯一了,因爲它會檢查「的某些地方」列太... 所以,如果我插入:

INSERT INTO table (id, theyear) VALUES (1, 2016); 
INSERT INTO table (id, theyear) VALUES (1, 2017); 

它說沒有錯誤,因爲UNIQUE檢查id和heear。

如何實現分區而不會丟失「id」列上的UNIQUE?

謝謝。

+0

你是否試圖在年份中添加一個單獨的'唯一'約束? – cwallenpoole

+0

我基於這個文檔:https://dev.mysql.com/doc/refman/5.7/en/partitioning-range.html,但在我看來,你不需要改變你的主鍵一個RANGE分區。他們使用的所有示例都沒有PRIMARY KEY。我錯過了什麼嗎?你是否試圖通過錯誤的KEY()分區? –

+0

爲什麼你想分區?你認爲什麼查詢會運行得更快?請提供該查詢和「SHOW CREATE TABLE」。我可能會爭辯說,一個合適的索引將會快速或快速地進行分區。也許該指數將從YEAR開始。提示:http://mysql.rjweb.org/doc.php/partitionmaint –

回答

0

由於您的查詢將在其中使用theyear,因此按RANGE進行分區將有助於處理大量數據,並具有正確的INDEX。

不要使用KEY() partitionning,保留現有的主鍵

INDEX IDX_theyear(theyear) 

PARTITION BY RANGE (theyear) ( 
PARTITION p0 VALUES LESS THAN (2017), 
PARTITION p1 VALUES LESS THAN (2018), 
PARTITION p2 VALUES LESS THAN (2019), 
PARTITION p3 VALUES LESS THAN (2020) 

例如。您可以稍後添加更多分區,但更難。如果你的數據比較老,那麼顯然從最早的年份開始

+0

我得到:「#1503 - PRIMARY KEY必須包含表的分區中的所有列功能「,正如我在問題中所說的... –

+0

你介意粘貼你的完整創建表代碼嗎? –