我有一个包含50GB数据的表现在我正在尝试在datetime列上进行分区,详细信息如下。
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)中创建复合主键,并且无法删除主键,因为它将允许重复记录, 我不想在我的代码中更改任何内容。 所以请建议。
答案 0 :(得分:1)
分区表上的任何UNIQUE键都必须包含分区键,否则UNIQUEness约束会非常昂贵。每个INSERT都必须检查所有分区,以验证是否违反了约束。
考虑到PARTITIONing通常仅对非常大的表有用,这种开销将是致命的。
您正在按月分区 - 为什么?你希望得到什么?检查"范围"在clickedTime上不会做"分区修剪" (我认为)。见EXPLAIN PARTITIONS SELECT ...
ID是什么样的,因为它是VARCHAR(255)?大PRIMARY KEY通常不实用。
这张表是MyISAM还是InnoDB?
我建议摆脱分区。
有哪些SELECT?我目前没有看到复合INDEX,通常谨慎的是使用DATETIME复合索引结束。