2011-01-05 5 views
1

私はテーブルT1を持っています。ここで、col Aは主キー、col BはテーブルT2の主キーである外部キーです。私はT1の中に(B、A)の複合インデックスを作成したい。しかし、MySQLではインデックスを(A、B)としてのみ作成することができます。それはcol Bが外来キーなのですか?説明してください2つのカラムを持つMySQLインデックスは、そのうちの1つは外部キーです

+0

使用しているスクリプトを投稿してください。 – Quassnoi

+0

そして、あなたが得るエラー... – Unreason

答えて

2

これは私のために正常に動作します:

CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY) ENGINE=InnoDB; 
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b INT NOT NULL REFERENCES t2(id)) ENGINE=InnoDB; 
CREATE INDEX ix_t1_b_a ON t1 (b, a); 

InnoDBは、インデックス内の行ポインタとしてクラスタ化キーが含まれていますが、明示的にフィールドを追加することを防止し、時にはいくつかのクエリを最適化するために必要なものは何もありません。

構文を確認してください。

0

これは意味がないと思います。 すでに一意の列(主キーは一意)を使用して複合インデックスを作成しようとしています。

0

ストレージ・エンジンとしてのInnoDBを使用しているので、単独でカラムBのインデックスは、InnoDBが主キーを使用してデータをクラスタリングカラムA(プライマリキー)

http://www.mysqlperformanceblog.com/2006/10/03/mysql-optimizer-and-innodb-primary-key/

+0

私の場合、実際には、col AとBの両方が主キーであり、COL Bも外部キーです。 mysqlは、コンポジット(A、B)としてデフォルトのインデックスを返します。しかし、私は(b、a) –

+0

@patruniので、Bにインデックスを作成してください - それはシーンの背後に - 列Aも含めます。 (Aはプライマリキーインデックスの一番左のカラムなので) –

+0

@Scrum Meister:しかし、Bのインデックスを作成する必要はありません。デフォルトでは、mysqlは外部キーからインデックスを取得します。このインデックスには、シーンの裏にAが含まれているといってもいいですか? –

0

を含むであろう。主キーを定義していない場合、InnoDBはヌル値を持たない一意のインデックスを代わりに使用しようとします。これにより、行が順番に挿入され、主キーを使用する結合のパフォーマンスが向上します。しかし、私の質問では、テーブルT1ではPKがcol Aでcol BがT1でユニークではない外部キーであると述べました。したがって、私がpkを(A、B)に設定すると、自動的にmysqlがプライマリインデックスとしてインデックスを作成します。 (B、A)のようにインデックスを変更しようとすると、Bは一意ではないので、InnoDBはクラスタインデックスを使用してインデックスを作成できません。だから、それはエラーを投げるでしょう。

関連する問題