2017-01-16 1 views
1

外部キーを追加した後、mysqlは複数のインデックスメソッドで以前にインデックスを作成したキーを強制的にインデックスします。私はInnoDBを使用しています。ここでインデックスフィールドが外部キーでもある場合は、複数のインデックスメソッドを使用する必要がありますか?

は、私のテーブルの構造である:

idcompany_idstudent_id ...

company_idstudent_idは使用して索引付けされていた:

ALTER TABLE `table` ADD INDEX `multiple_index` (`company_id`,`student_id`) 

私は複数のインデックス列を使用する理由?ので、ほとんどの時間は、私のクエリは次のとおりです。

SELECT * FROM `table` WHERE company_id = 1 AND student_id = 3 

はいつか私だけSTUDENT_IDして列をフェッチ:

SELECT * FROM `table` WHERE student_id = 3 

company_idstudent_id MySQLの外部キーを追加した後は、個別にそれらの両方をインデックス化。ですから、私は複数のフィールドとインデックスフィールドを別々に持っています。

私は複数のインデックスキーを削除する必要がありますか?

答えて

1

によって異なります。同じ学生が多くの企業に属している場合は、それを削除しないでください。 company_id = 1 AND student_id = 3を照会するとき、オプティマイザは1つの索引を選択しなければなりません。その後、複数の生徒または複数の企業をチェックする必要があります。

私の腸は、これは当てはまりません。学生は〜10社以上の企業に関連することはないため、インデックスをスキャンすることは大したことではありません。つまり、これは両方の列に索引を付けるよりもはるかに脆弱です。その場合、オプティマイザは正しいことが何であるかを知っています。それには2つの指標があり、それはそうでないかもしれないし、将来的にはそうでないかもしれないので、FORCE INDEXがstudent_idインデックスを使用していることを確認する必要があります。

もう1つ考慮すべきことは、この表の使い方です。書かれていることはほとんどありませんが、頻繁に読むのであれば、余分なインデックスのためのスペース以上の罰はあまりありません。

TL; DR:インデックスは冗長ではありません。あなたがそれを保つべきかどうかは複雑です。

+0

ありがとうございました!私は大きなデータであるため、複数のインデックスを使用しました。私は複数のインデックスを使って、私は学生の情報をより速く取り出すことができると考えていました。 – Rashad

関連する問題