InnoDBデータベースのテーブルをパーティション分割する方法を調べています。 UTCタイムスタンプに対応する列があり、その周りを分割したいと思います。
キャプチャしたい基本的なアイデアは、パーティション化スキームで、固定数のパーティションで、次のようにそれらを循環します。
3つのパーティションがある場合(簡略化のために3つ)
- 1日目のタイムスタンプ列のあるデータはパーティション1に入ります
- 2日目のタイムスタンプ列のデータはパーティション2に入ります
- 3日目のタイムスタンプ列のあるデータはパーティション3に入ります
- 4日目のタイムスタンプ列のあるデータは、パーティション1に入ります
- ..... 5日目....パーティション2
- ...すすぎ、繰り返し
基本的に、タイムスタンプから日を抽出し、行をパーティションDAY MOD N
に入れます。ここで、DAY
はタイムスタンプが対応する日(時間/分/秒を除外)およびN
はパーティションの数です。
これはおそらく簡単に実行できますが、これをエミュレートするための同様の例が見つかりません。このようにパーティション化するには、ALTER TABLE
クエリは何でしょうか?
更新
Atxdbaの提案により、ハッシュによるパーティション化を試みました。私は次の声明を試みました:
ALTER TABLE table_to_partition PARTITION BY HASH(DAYOFMONTH(FROM_UNIXTIME(my_timestamp))) partitions 8;
これにより、エラーコード1564が発生します。This partition function is not allowed.
を見る このパーティション分割の制限のリスト を見ると、FROM_UNIXTIMESTAMPがテーブルのパーティショニングでサポートされていないため、タイムスタンプから日付への別の変換必要とされている。
ハッシュパーティションは整数式に基づいている必要があるため、FROM_UNIXTIME()は使用できません。ただし、タイムスタンプが整数として格納されていると仮定すると、DIV
を使用して整数を返すことができます。
これが、説明した方法でのパーティショニングのデモです。
mysql> create table table_to_partition (
my_timestamp int unsigned primary key
) partition by hash(my_timestamp DIV (60*60*24)) partitions 3;
mysql> insert into table_to_partition values (unix_timestamp(now()));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 1 day));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 2 day));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 3 day));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 4 day));
mysql> insert into table_to_partition values (unix_timestamp(now()-interval 5 day));
mysql> select table_name, partition_name, table_rows
from information_schema.partitions where table_name='table_to_partition';
+--------------------+----------------+------------+
| table_name | partition_name | table_rows |
+--------------------+----------------+------------+
| table_to_partition | p0 | 2 |
| table_to_partition | p1 | 2 |
| table_to_partition | p2 | 2 |
+--------------------+----------------+------------+
ハッシュパーティショニング を見たいと思うかもしれません。必要な「バケット」の数とハッシュする列を定義するだけで、mysqlが行の分散を処理します。
準関連:パーティション分割されたテーブルに自動インクリメントカラムがある場合、テーブルタイプに応じて異なる動作をすることに注意してください。
MyISAM:オート株式会社。列はパーティションごとに増加します
InnoDB:オート株式会社。列はテーブル内で一意になります。