2015-02-08 85 views
0

我有一張包含50GB數據的表,現在我正試圖在下面的datetime列上進行分區。如何在非主鍵列(MYSQL)中對錶進行分區

CREATE TABLE EDR2 (id varchar(255),appKey varchar(255),clickedTime datetime ,ettId bigint(20),primary key(id),Key `ettId` (ettId),Key `clickedTime_index` (`clickedTime`)) 
PARTITION BY RANGE (day(clickedTime)) 
(PARTITION p01 VALUES LESS THAN (2) , 
PARTITION p02 VALUES LESS THAN (3) , 
PARTITION p03 VALUES LESS THAN (4) , 
PARTITION p04 VALUES LESS THAN (5) , 
PARTITION p05 VALUES LESS THAN (6) , 
PARTITION p06 VALUES LESS THAN (7) , 
PARTITION p07 VALUES LESS THAN (8) , 
PARTITION p08 VALUES LESS THAN (9) , 
PARTITION p09 VALUES LESS THAN (10) , 
PARTITION p10 VALUES LESS THAN (11) , 
PARTITION p11 VALUES LESS THAN (12) , 
PARTITION p12 VALUES LESS THAN (13) , 
PARTITION p13 VALUES LESS THAN (14) , 
PARTITION p14 VALUES LESS THAN (15) , 
PARTITION p15 VALUES LESS THAN (16) , 
PARTITION p16 VALUES LESS THAN (17) , 
PARTITION p17 VALUES LESS THAN (18) , 
PARTITION p18 VALUES LESS THAN (19) , 
PARTITION p19 VALUES LESS THAN (20) , 
PARTITION p20 VALUES LESS THAN (21) , 
PARTITION p21 VALUES LESS THAN (22) , 
PARTITION p22 VALUES LESS THAN (23) , 
PARTITION p23 VALUES LESS THAN (24) , 
PARTITION p24 VALUES LESS THAN (25) , 
PARTITION p25 VALUES LESS THAN (26) , 
PARTITION p26 VALUES LESS THAN (27) , 
PARTITION p27 VALUES LESS THAN (28) , 
PARTITION p28 VALUES LESS THAN (29) , 
PARTITION p29 VALUES LESS THAN (30) , 
PARTITION p30 VALUES LESS THAN (31) , 
PARTITION p31 VALUES LESS THAN MAXVALUE);* 

,我得到的錯誤: -

***ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function*** 

我不能創建(ID,clickedTime)複合主鍵,不能刪除主鍵,因爲它將使重複記錄, 我不想在我的代碼中更改任何內容。 所以請建議。

+1

嗯。除非它是主鍵(以及所有其他唯一約束)的一部分,否則不能在列上分區。因此,你不能做你想做的事。您可能需要閱讀以下文檔:http://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-partitioning-keys-unique-keys.html。 – 2015-02-08 14:43:05

+0

嗨,先生,沒關係但我仍然困惑,爲什麼他們不允許分區的非主鍵列或問題與我的分區要求。謝謝。 – 2015-02-08 14:53:34

+0

。 。如果你想使用分區鍵,那麼它需要成爲主鍵的一部分。瞭解這一點需要深入分區。您可以將表複製到具有所需密鑰的另一個結構以及分區。這需要時間,但它會完成你想要的。 – 2015-02-08 15:07:12

回答

1

分區表上的任何UNIQUE鍵都必須包含分區鍵,否則UNIQUEness約束會非常痛苦。每個INSERT將必須檢查所有分區以驗證約束未被違反。

考慮到PARTITIONing通常只在非常大的表上有用,這種開銷將是致命的。

您正在分月份的月份 - 爲什麼?你希望獲得什麼?在clickedTime上檢查「範圍」不會執行「分區修剪」(我認爲)。請參閱EXPLAIN PARTITIONS SELECT ...

什麼是ID,它是VARCHAR(255)?大的主鍵通常不實用。

這張表是MyISAM還是InnoDB?

我建議擺脫分區。

什麼是一些選擇?我目前沒有看到複合INDEX,通常謹慎的做法是在DATETIME下有一個的結尾

+0

我只需要在活動表中存儲60天的數據,因此我想旋轉最近60天的分區,所以我想在每個月的某天進行分區。另外,我無法在日期時間列中創建主鍵或唯一鍵。同樣,默認情況下,ID的列的大小由框架(JPA)設置。 – 2015-03-09 07:49:40

+0

ID列的大小由框架設置?我應該補充說明爲什麼第三方軟件會受到傷害的原因。 2015-03-09 12:41:16

+0

您是否已經開始刪除超過60天的數據?您可能會遇到一個粗暴的驚喜 - 刪除一半分區將會很慢。使用'PARTITION BY RANGE',通過使用'DROP PARTITION'即可實現。而_that_是使用'PARTITION'的好理由,但只有'BY RANGE'。 – 2015-03-09 13:18:32