(この答えはInnoDBは、MyISAMのないを前提としています。MyISAMのための私のコメントの一部が不正にするインデックスの実装に違いがあります。)
、テーブルのPRIMARY KEY
は、AUTO_INCREMENT
を含む複数のフィールドで構成できます。
AUTO_INCREMENT
のためのMySQLの唯一の要件は、それが一部インデックス内最初列であることです。 post_id
がAUTO_INCREMENT
ある
PRIMARY KEY(user_id, post_id),
INDEX(post_id)
をしていますが、user_id
により、「クラスタリング」のデータから利益を得ることができる:各ユーザーのための多くの記事があることができる場所のはPosts
、この例を見てみましょう。このクラスタリングは、「パーティション・キー」はユニークである必要はありません...戻るあなたの質問に
SELECT ... FROM Posts
WHERE user_id = 1234;
ようなクエリを行うには、それがより効率的
になるだろう。だから、私はあなたの「重複したエントリーに分割できません」とは断言していません。
INDEX(id, date)
また、PRIMARY KEY(id)
がある場合は、本質的に役に立たないです。 IDで検索すると、PRIMARY KEY(id)
は完全なアクセスを提供します。インデックスにdate
を追加しても役立ちません。 date
で検索すると、id
ではなく、(id, date)
は、複合インデックスの「左」部分のみが使用できるため、役に立たない。
おそらくあなたは、日付範囲を効率的に行うために
PRIMARY KEY(date, id),
INDEX(id)
と非パーティションテーブルにつながっていますか? (注:パーティション分割は役に立ちません。)
おそらくあなたは、これは有益である場合には
SELECT ... WHERE x = 123 AND date BETWEEN ...
ことになるだろう:あなたがこれを行う
INDEX(x, date)
場合にのみ、私たちは、パーティショニングの有用性を議論するために始めることができます。
WHERE x BETWEEN ...
AND date BETWEEN ...
これには、「2次元」のインデックスが必要です。このインデックスは、SPATIAL
で存在します。
my discussion of partitioningを参照してください。パーティション化に使用するケースは4つしかありません。また、2Dのためにパーティショニングを使用する方法に関するディスカッションにもリンクしています。
ボトムライン:は、どのようなクエリが役立つかを明確に把握することなく、パーティション分割について説明してはいけません。それらを提供する;さらに議論することができます。