2

私は 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 を持つ複数のレコードの状況を停止しませんが、投稿日は異なります。投稿されたフィールドでパーティショニングを使用し、元の一意の制約を維持する方法はありますか?

4

1 に答える 1

3

私はこれと同じ「問題」に直面しており、そのために見つけた回避策の1つは、テーブルを2つに分割することで、あなたの場合は次のようになりました。

CREATE TABLE transactions (
  id INT NOT NULL AUTO_INCREMENT,
  description CHAR(100),
  PRIMARY KEY (id)
) ENGINE=MyISAM;

そして他の:

CREATE TABLE transactions_date (
  id INT NOT NULL,
  posted DATE
) ENGINE=MyISAM
PARTITION BY HASH(MONTH(posted)) PARTITIONS 12;

SELECT明らかな問題は、ステートメントを使用するときにすべてのデータを取得するために両方のテーブルをフェッチする必要があるなど、アプリケーションに追加のロジックを追加する必要があることです。、およびに関連するタスクを支援するために、おそらくトリガーを使用できます。INSERTUPDATEDELETE

注意:または列でパーティションのプルーニングを使用することでメリットが得られる唯一の関数は、 、および(この最後の関数は MySQL 5.5 以降でのみ使用可能です)。DATEDATETIMEYEAR()TO_DAYS()TO_SECONDS()

于 2013-02-27T18:13:58.723 に答える