2012-12-08 8 views
10

クラスタードインデックスの仕組みをすべて読んでいて、自分のアプリにとって有益だと思っています。主キーは自動的にクラスタ化されたインデックスであることを理解していますが、主キー以外の列にクラスタードインデックスを追加する方法はありますか?Mysqlクラスタード・インデックスはどのように作成しますか?

I.e.ユーザー投稿用のデータストア。各投稿にはIDがありますが、ユーザーIDもありますが、ユーザーが複数回投稿できるため、user-idは主キーではありません。どのようにユーザーIDにクラスタード・インデックスを追加すれば良いでしょうか?

答えて

13

Clustered and Secondary Indexesによれば、テーブルごとに1つのクラスタ化インデックスを持つことができます。

クラスタ化インデックス以外のすべてのインデックスは、セカンダリインデックスと呼ばれます。

テーブルにプライマリインデックスはありませんが、別のユニークインデックスがある場合は、これがクラスタ化インデックスとして使用されます。

テーブルにPRIMARY KEYを定義しないと、MySQLはすべてのキー列がNOT NULLで、InnoDBがクラスタ化インデックスとして使用する最初のUNIQUEインデックスを探します。

クラスタリングされたインデックスを自分で追加するのではなく、MySQLはクラスタ化されたインデックスとしてテーブルのプライマリまたは最初の一意のインデックスを選択すると結論づけます。

7

@Olafが説明しているように、InnoDBは、主索引が存在しない場合は主索引または最初の一意索引、2つの索引がない場合は隠れ列をクラスタ索引にする列または列の組み合わせを選択します)。

クラスタ化インデックスとして非一意な列を持っているしたい場合は、一意のキーとしてpost_idを定義し、クラスタ化インデックスとして選択される主キーuser_idpost_idの組み合わせを作ることができる:

CREATE TABLE Post 
(post_id INT NOT NULL AUTO_INCREMENT 
, user_id INT NOT NULL 
--- other columns 
, CONSTRAINT Post_PK 
    PRIMARY KEY (user_id, post_id)  -- your clustered index 
, CONSTRAINT post_id_UQ 
    UNIQUE (post_id)    -- you still want uniqueness for the `post_id` 
) ENGINE = InnoDB ; 

これは良いアイデアかどうかは、アプリケーション、データボリューム、およびクエリによって異なります。一般に、クラスタ化されたキーの最高の特性は、固有で、狭く、静的で、ますます増加しています。そのため、自動インクリメントの列が最適です。キンバリーL.メーカーTrippのブログ記事でそれについての記事を読む:Ever-increasing clustering key - the Clustered Index Debate..........again!The Clustered Index Debate Continues...(彼らはSQL-Serverのためのものであるので、同じ問題がInnoDBののクラスタ化インデックスに99%を適用停止しない)

(user_id, post_id)のようなクラスタ化されたキーが持っています最初の3つのプロパティが増加しているわけではありません。これにより、CIが断片化し、テーブルへの挿入が遅くなる可能性があります。

WHERE user_id = ?条件または範囲条件WHERE user_id BETWEEN ? AND ?またはGROUP BY user_idを持つより効率的なクエリが得られます。必要なデータは、クラスタードインデックス内の1つの場所と必要な順序で見つかります。

私はあなたの場合に最適なものを選択するテストを行うことをお勧めします。


テーブルに複数のクラスタ化インデックスを使用できるようにする、MySQLの変形版TokuDBもあります。記事の詳細:Introducing Multiple Clustering Indexes

1

間違った質問をすることをお勧めします。

もう1つの質問は、「私は現在のPRIMARY KEYを取り除くことができるので、私はこの他のものを「クラスタ化」することができますか?多くの場合、AUTO_INCREMENTは削除するか、簡単なINDEXに変更することができます。

"このSELECT ...の最適なインデックスは何ですか?"他の人はの第2のクラスタ化インデックスは基本的なMySQLの問題ではないことを指摘していますので、次の選択肢は何ですか?私はSELECTを知らずにそれに答えることはできません。しかし、my Index Cookbookは、SELECTsという大文字の質問に答えています。

関連する問題