我的数据库设计包括多个 MYISAM 表,其中包含在线收集的测量值,
每行记录包含自动递增的 id、一些数据和一个表示 unixtime 的整数。
我正在设计一种老化机制,并且我有兴趣使用MySQL分区来基于unixtime动态地对每个这样的表进行分区。
假设我感兴趣的是每个分区将代表单月的数据,最后一个分区应代表 2 个月,如果记录到达下一个未代表的月份,则代表 2 个月的分区应重新组织以代表单月,并且新分区应创建代表 2 个月(1 个取自最后一个分区,1 个用于未来测量),
此外,当创建新分区时,我感兴趣的是最旧的分区将被删除。
- 我应该使用什么类型的分区(我的 unixtime 不是唯一键,我将如何使用 unixtime 进行分区)?
- 我如何根据添加到表中的新记录设计完全动态的分区?
更新 12.12.12
我发现了与我所描述的类似方法的有趣链接your-magical-range-partitioning-maintenance-query http://code.openark.org/blog/mysql/your-magical-range-partitioning-maintenance-query.
-
分区不需要仅基于唯一键。但是,如果存在唯一键,则应将其包含在用于对表进行分区的列中。要在 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+ 中对日期时间列进行分区:
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
附:如果 SQL 不完全正确,我们深表歉意 - 现在无法解析它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)