私は MySQL 5.5 を使用しており、顧客のトランザクションを格納する既存のテーブルを運用しています。表の簡略版は次のとおりです。
CREATE TABLE transactions (
id INT NOT NULL AUTO_INCREMENT,
description CHAR(100),
posted DATE,
PRIMARY KEY (id)
) ENGINE=MyISAM
トランザクション日付でパーティショニングを使用して、日付フィルタリングを使用するレポートをより高速に実行する方法を検討しています。次の試行は、 MySQL パーティショニング キーのドキュメントで説明されている主キーとパーティションの制限により失敗します。
mysql> CREATE TABLE transactions (
-> id INT NOT NULL AUTO_INCREMENT,
-> description CHAR(100),
-> posted DATE,
-> PRIMARY KEY (id)
-> ) ENGINE=MyISAM
-> PARTITION BY HASH(MONTH(posted)) PARTITIONS 12;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
考えられる回避策は次のとおりです。
CREATE TABLE transactions (
id INT NOT NULL AUTO_INCREMENT,
description CHAR(100),
posted DATE,
PRIMARY KEY (id, posted)
) ENGINE=MyISAM
PARTITION BY HASH(MONTH(posted)) PARTITIONS 12;
別の回避策は次のとおりです。
CREATE TABLE transactions (
id INT NOT NULL AUTO_INCREMENT,
description CHAR(100),
posted DATE,
KEY (id)
) ENGINE=MyISAM
PARTITION BY HASH(MONTH(posted)) PARTITIONS 12;
どちらの回避策でも、データベースは同じ ID を持つ複数のレコードの状況を停止しませんが、投稿日は異なります。投稿されたフィールドでパーティショニングを使用し、元の一意の制約を維持する方法はありますか?