2017-05-02 1 views
-1

mysqlでは、自動インクリメントと別のフィールドで構成される複合主キーを使用できますか?また、私はMySQLのパーティションに関する問い合わせを持っている> further-を説明するためにysqlの複合キーのパーティション

を私の「MySQLのパーティショニング」の論理

を批評してください。 私はMySQLでテーブルを分割する必要があります、それは1つの主キーIDを持っています。 私は日付フィールド(プライマリではない、重複したエントリ)で分割する必要があります。 私たちは重複したエントリを分割できないので、私は複合キー - >(id、date)を作成しました。 このコンポジットキーにパーティションを作成するにはどうすればよいですか? MySQLでは

事前のおかげで...

答えて

0

(この答えはInnoDBは、MyISAMのないを前提としています。MyISAMのための私のコメントの一部が不正にするインデックスの実装に違いがあります。)

、テーブルのPRIMARY KEYは、AUTO_INCREMENTを含む複数のフィールドで構成できます。

AUTO_INCREMENTのためのMySQLの唯一の要件は、それが一部インデックス内最初列であることです。 post_idAUTO_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のためにパーティショニングを使用する方法に関するディスカッションにもリンクしています。

ボトムライン:は、どのようなクエリが役立つかを明確に把握することなく、パーティション分割について説明してはいけません。それらを提供する;さらに議論することができます。