2012-01-13 93 views
3

我想使用mysql分區表將表劃分爲YEAR和WEEK編號。我知道如何使用mysql合併表執行此操作,但分區表是不同的。有人可以請幫助下面的表模式?按年份劃分的MySQL分區

CREATE TABLE `tableName` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `dateandtime` datetime NOT NULL, 
    `othervalue` int(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

它也必須在某個引擎?

如果我將dateandtime存儲爲int(10)時間戳,我該怎麼做?

CREATE TABLE `tableName` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `dateandtime` int(10) NOT NULL, 
    `othervalue` int(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

回答

2

MySQL 5.1中不能按日期做分區,所以你必須解決辦法...通常你按功能劃分TO_DAYS(dateandtime),例如像這樣:

 
CREATE TABLE tbl (
...) ENGINE=InnoDB 
PARTITION BY RANGE (to_days(dateandtime)) (
PARTITION pNULL VALUES LESS THAN (0) ENGINE = InnoDB, 
PARTITION p20111218 VALUES LESS THAN (TO_DAYS('2011-12-18')) ENGINE = InnoDB, 
PARTITION p20111225 VALUES LESS THAN (TO_DAYS('2011-12-25')) ENGINE = InnoDB, 
PARTITION pNew VALUES LESS THAN MAXVALUE ENGINE = InnoDB 
) 

我在這裏4個分區定義 - 第一隻是爲了完整性,以便將來插入日期不會失敗。 (您不能插入一個不存在分區的值。)第一個分區是爲了提高性能 - 將NULL值存儲在那裏。實際上正在使用中間的2個分區,每個分區保存一週的數據。

使用ALTER TABLE tbl DROP PARTITION xyz,您可以刪除舊分區(與只刪除舊行相比,速度非常快)。您可以通過拆分最後一個分區來添加新分區:

 
ALTER TABLE tbl REORGANIZE PARTITION pNew INTO (
    PARTITION p20120115 VALUES LESS THAN (TO_DAYS('2012-01-16')), 
    ... 
    PARTITION pNew VALUES LESS THAN (MAXVALUE) 
); 
+0

dateandtime需要成爲PRIMARY或UNIQUE鍵的一部分嗎? – Bretticus 2012-05-18 01:18:16

+0

不......我用於每天有超過12百萬行的日誌表,所以在同一秒內也有許多行,所以UNIQUE在我的情況下是不可能的。 – Marki555 2012-05-18 08:17:12