2013-04-26 35 views
0

我有一個30M行表,我想按日期對其進行分區。Mysql將所有數據放入一個分區

mysql > SHOW CREATE TABLE `parameters` 

CREATE TABLE `parameters` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `add_time` datetime DEFAULT NULL, 
    ...(etc) 
) ENGINE=MyISAM AUTO_INCREMENT=28929477 DEFAULT CHARSET=utf8 

表存儲過去5年的數據,行數顯着增加。我想分幾年(2009年,2010年,2011年,2012年,2013年)。

ALTER TABLE parameters DROP PRIMARY KEY, ADD INDEX(id); 

ALTER TABLE parameters PARTITION BY RANGE (TO_DAYS(id)) (
    PARTITION y2009 VALUES LESS THAN (TO_DAYS('2010-01-01')), 
    PARTITION y2010 VALUES LESS THAN (TO_DAYS('2011-01-01')), 
    PARTITION y2011 VALUES LESS THAN (TO_DAYS('2012-03-01')), 
    PARTITION y2012 VALUES LESS THAN (TO_DAYS('2013-01-01')), 
    PARTITION y2013 VALUES LESS THAN MAXVALUE 
); 

Everyting適用於開發的服務器上,但有生產服務器上的問題。 問題:幾乎所有的行都移動到第一個分區(y2009)。但數據是按年份均勻分佈的。物理上,DATA文件夾中有大量的y2009.myd文件,其他分區的大小更小。 我也試圖重組的第一個分區,以排除空日期:

alter table raw 
reorganize partition y2012 into (
    PARTITION y0 VALUES LESS THAN (0), 
    PARTITION y2012 VALUES LESS THAN (TO_DAYS('2013-01-01')), 
); 

PS:生產和開發服務器具有相同版本的MySQL 5.1.37的

回答

1

您需要的範圍無法ID使用日期列分區。
我已經改變了TO_DAYS(id)TO_DAYS(add_time)

嘗試以下:

ALTER TABLE parameters PARTITION BY RANGE (TO_DAYS(add_time)) (
    PARTITION y0 VALUES LESS THAN (TO_DAYS('2009-01-01')), 
    PARTITION y2009 VALUES LESS THAN (TO_DAYS('2010-01-01')), 
    PARTITION y2010 VALUES LESS THAN (TO_DAYS('2011-01-01')), 
    PARTITION y2011 VALUES LESS THAN (TO_DAYS('2012-03-01')), 
    PARTITION y2012 VALUES LESS THAN (TO_DAYS('2013-01-01')), 
    PARTITION y2013 VALUES LESS THAN MAXVALUE 

);

+0

非常感謝。我犯了一個粗心的錯誤。 – zenio 2013-04-26 06:28:04

相關問題