如何在非主键列(MYSQL)中对表进行分区
我有一张包含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)复合主键,不能删除主键,因为它将使重复记录, 我不想在我的代码中更改任何内容。 所以请建议。
分区表上的任何UNIQUE键都必须包含分区键,否则UNIQUEness约束会非常痛苦。每个INSERT将必须检查所有分区以验证约束未被违反。
考虑到PARTITIONing通常只在非常大的表上有用,这种开销将是致命的。
您正在分月份的月份 - 为什么?你希望获得什么?在clickedTime上检查“范围”不会执行“分区修剪”(我认为)。请参阅EXPLAIN PARTITIONS SELECT ...
什么是ID,它是VARCHAR(255)?大的主键通常不实用。
这张表是MyISAM还是InnoDB?
我建议摆脱分区。
什么是一些选择?我目前没有看到复合INDEX,通常谨慎的做法是在DATETIME下有一个的结尾。
我只需要在活动表中存储60天的数据,因此我想旋转最近60天的分区,所以我想在每个月的某天进行分区。另外,我无法在日期时间列中创建主键或唯一键。同样,默认情况下,ID的列的大小由框架(JPA)设置。 – 2015-03-09 07:49:40
您是否已经开始删除超过60天的数据?您可能会遇到一个粗暴的惊喜 - 删除一半分区将会很慢。使用'PARTITION BY RANGE',通过使用'DROP PARTITION'即可实现。而_that_是使用'PARTITION'的好理由,但只有'BY RANGE'。 – 2015-03-09 13:18:32
嗯。除非它是主键(以及所有其他唯一约束)的一部分,否则不能在列上分区。因此,你不能做你想做的事。您可能需要阅读以下文档:http://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-partitioning-keys-unique-keys.html。 – 2015-02-08 14:43:05
嗨,先生,没关系但我仍然困惑,为什么他们不允许分区的非主键列或问题与我的分区要求。谢谢。 – 2015-02-08 14:53:34
。 。如果你想使用分区键,那么它需要成为主键的一部分。了解这一点需要深入分区。您可以将表复制到具有所需密钥的另一个结构以及分区。这需要时间,但它会完成你想要的。 – 2015-02-08 15:07:12