我有一个包含 50GB 数据的表,现在我尝试在日期时间列上进行分区,下面是详细信息。
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)中创建复合主键,也无法删除主键,因为它会允许重复记录, 我不想更改我的代码中的任何内容。 所以请提出建议。
最佳答案
分区表上的任何 UNIQUE 键都必须包含分区键,否则 UNIQUEness 约束的成本将非常高昂。每个 INSERT 都必须检查所有分区以验证是否违反了约束。
考虑到分区通常仅在非常大的表上有用,这种开销将是致命的。
您要在每月的某一天进行分区 - 为什么?你希望获得什么?检查 clickedTime 上的“范围”不会执行“分区修剪”(我认为)。请参阅解释分区选择...
ID 是什么样的,如果是 VARCHAR(255) 的话?大主键通常不实用。
这个表是MyISAM还是InnoDB?
我建议摆脱分区。
有哪些 SELECT?我目前没有看到复合索引,通常谨慎的做法是使用以 DATETIME 结尾的复合索引。
关于mysql - 如何在非主键列中对表进行分区(MYSQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28395168/