@Olafが説明しているように、InnoDBは、主索引が存在しない場合は主索引または最初の一意索引、2つの索引がない場合は隠れ列をクラスタ索引にする列または列の組み合わせを選択します)。
クラスタ化インデックスとして非一意な列を持っているしたい場合は、一意のキーとしてpost_id
を定義し、クラスタ化インデックスとして選択される主キーuser_id
とpost_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