7

私の DB 設計には、オンラインで収集された測定値を含む複数の MYISAM テーブルが含まれています。

各行レコードには、自動インクリメントされた ID、いくつかのデータ、および unixtime を表す整数が含まれます。

私はエージング メカニズムを設計しており、MySQL パーティショニングを使用して、unixtime に基づいてそのような各テーブルを動的に分割することに興味があります。

各パーティションが 1 か月のデータを表し、最後のパーティションが 2 か月を表し、次の表されていない月のレコードが到着した場合、2 か月を表すパーティションを 1 か月を表すように再編成し、新しいパーティションを2 か月を表すように作成されます (1 つは最後のパーティションから取得され、1 つは将来の測定用に取得されます)。

さらに、新しいパーティションが作成されると、最も古いパーティションが削除されることに興味があります。

  1. どのタイプのパーティショニングを使用する必要がありますか?
  2. テーブルに追加された新しいレコードに基づいて完全に動的になるようにパーティションを設計するにはどうすればよいですか?

更新 12.12.12

your-magical-range-partitioning-maintenance-queryについて説明したものと同様のアプローチへの興味深いリンクを見つけました。

4

1 に答える 1

10
  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+ で 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));
    
  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 が正確でない場合はお詫びします。現在は解析できません。

于 2013-06-04T21:08:01.973 に答える