我有一个包含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)中创建复合主键,也无法删除主键,因为这将允许重复记录,我不想更改代码中的任何内容。所以请提出建议。
分区表上的任何UNIQUE键都必须包括分区键,否则UNIQUEness约束的成本将非常高。每个INSERT都必须检查所有分区,以验证是否违反了约束。
考虑到PARTITION通常只在非常大的表上有用,这种开销将是致命的。
你在一个月的哪一天分区-为什么?你希望得到什么?在clickedTime上检查"范围"不会进行"分区修剪"(我认为)。参见EXPLAIN PARTITIONS SELECT ...
ID是什么样的,它是VARCHAR(255)?大主键通常不实用。
这张表是MyISAM还是InnoDB?
我建议取消分区。
有哪些选择?我目前没有看到复合index,通常谨慎的做法是使用以DATETIME结尾的复合索引。