2012-12-12 15 views
4

我的數據庫設計包括在線收集測量多個MyISAM表動態MySQL分區,基於UnixTime

每行記錄包含自動遞增的ID,有些數據並表示unixtime整數。

我正在設計一個老化機制,我有興趣使用MySQL分區來動態分配基於unixtime的每個這樣的表。假設我感興趣的是每個分區將代表單個月份的數據,最後一個分區應該代表2個月,如果記錄到達下一個未表示的月份,代表2個月的分區應重新組織爲單個月份,並且應創建代表2個月的新分區(1取自最後一個分區,1取未來測量值),

此外,當創建新分區時,我有興趣知道最舊的分區將被丟棄。

  1. 我應該使用什麼類型的分區(我的unixtime不是唯一的密鑰,我將如何使用unixtime進行分區)?
  2. 我將如何根據添加到表中的新記錄設計分區以完全動態化?

UPDATE 12.12.12

我發現,有趣的鏈接,類似的方法來我所描述your-magical-range-partitioning-maintenance-query

回答

6
  1. 分區並不需要完全基於唯一的密鑰。但是,如果存在唯一密鑰,則應將其包含在用於對錶進行分區的列中。要在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)); 
    
  2. 完全自動化的版本(這將每月保持自己的分區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不完全正確 - 現在無法解析它。