我的数据库设计包括测量多个MyISAM表在线收集,
每行记录包含自动递增的ID,有些数据并表示unixtime整数。
我设计的老化机制,我有兴趣使用MySQL分割以基于unixtime动态每个这样的表。
说我有兴趣的每个分区将代表数据的单月,最后一个分区应该代表2个月,如果记录下一个未表示一个月到达,那代表的2-个月就应重新组织代表单月的分区,新分区应创建表示2个月(1从用于将来测量最后一个分区和1取),
此外,当一个新的分区中创建一个我感兴趣的是最古老的分区将被丢弃。
- 什么类型的分区,我应该使用(我unixtime不是唯一的关键,而如何将我使用unixtime进行分区的目的)?
- 我将如何设计分区得到充分的动力基础上加入了新表的记录?
UPDATE:12.12.12
我发现,有趣的链接,类似的方法来我所描述的魔法范围分区维护查询 。
分区并不需要在一个独特的密钥仅为主。 然而,如果唯一的键存在,则它应该被包括在用于划分在表列。 要在UNIXTIME列分区表做:
ALTER TABLE MyTable PARTITION BY RANGE COLUMNS (UNIX_TIMESTAMP(datetime_column)) ( PARTITION p01 VALUES LESS THAN (2), PARTITION p02 VALUES LESS THAN (3), PARTITION p03 VALUES LESS THAN (4), PARTITION p04 VALUES LESS THAN (MAXVALUE));
或者你也可以划分客场在MySQL 5.5+ datetime列挺直:
ALTER TABLE MyTable PARTITION BY RANGE COLUMNS (datetime_column) ( PARTITION p01 VALUES LESS THAN ('2013-01-01'), PARTITION p02 VALUES LESS THAN ('2013-02-01'), PARTITION p03 VALUES LESS THAN ('2013-03-01'), PARTITION p04 VALUES LESS THAN (MAXVALUE));
全自动版本(这将每月保持自己的分区,5个月的数据保持):
ALTER TABLE MyTable PARTITION BY RANGE COLUMNS (YEAR(datetime_column)*100 + MONTH(datetime_column)) ( PARTITION p201301 VALUES LESS THAN (201301), PARTITION p201302 VALUES LESS THAN (201302), PARTITION p201303 VALUES LESS THAN (201303), PARTITION p201304 VALUES LESS THAN (201304), PARTITION p201305 VALUES LESS THAN (201305), PARTITION p_MAXVALUE VALUES LESS THAN (MAXVALUE)); DECLARE @Min_Part int DECLARE @Last_Part int DECLARE @SQL varchar (1000) If (select count (distinct MONTH(datetime_column)) from MyTable) > 5 THEN BEGIN select @Min_Part = (select min(year(datetime_column)*100 + month(datetime_column)) from MyTable), @Last_Part = (select max(year(datetime_column)*100 + month(datetime_column)) from MyTable) set @SQL = 'Alter table MyTable REORGANIZE PARTITION p_MAXVALUE (into partition p' +TO_CHAR (@Last_Part) + 'values less than (' + TO_CHAR (@Last_Part) + ')' call common_schema.eval (@sql) set @SQL = 'Alter table MyTable DROP PARTITION p' + TO_CHAR (@Min_Part) call common_schema.eval (@sql) END
PS道歉,如果SQL不完全正确的 - 现在不能分析它。