我的数据库设计包括多个MYISAM表,其中包含在线收集的测量值
每个行记录包含自动递增的id,一些数据和一个表示unixtime的整数。
我正在设计一个老化机制,我有兴趣使用MySQL分区动态地基于unixtime对每个这样的表进行分区。
假设我感兴趣的是每个分区将代表单个月的数据,最后一个分区应代表2个月,如果记录到达下一个未表示的月份,则代表2个月的分区应重新组织以表示单个月,并且应该创建一个代表2个月的新分区(1个从最后一个分区获取,1个用于将来的测量),
此外,当创建新分区时,我感兴趣的是将删除最旧的分区。
更新12.12.12
我找到了与我所描述的your-magical-range-partitioning-maintenance-query类似方法的有趣链接。
答案 0 :(得分:8)
分区不需要仅基于唯一键。但是,如果存在唯一键,则它应包含在用于对表进行分区的列中。要在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
P.S。如果SQL不完全正确,请道歉 - 现在无法解析它。