web-dev-qa-db-ja.com

タイムスタンプでテーブルをパーティション化する方法。毎日のデータはパーティション化されます。

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がテーブルのパーティショニングでサポートされていないため、タイムスタンプから日付への別の変換必要とされている。

4
Chris

ハッシュパーティションは整数式に基づいている必要があるため、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 |
+--------------------+----------------+------------+
4
Bill Karwin

ハッシュパーティショニング を見たいと思うかもしれません。必要な「バケット」の数とハッシュする列を定義するだけで、mysqlが行の分散を処理します。

1
atxdba

準関連:パーティション分割されたテーブルに自動インクリメントカラムがある場合、テーブルタイプに応じて異なる動作をすることに注意してください。

MyISAM:オート株式会社。列はパーティションごとに増加します

InnoDB:オート株式会社。列はテーブル内で一意になります。

0
user9866