2009-06-09 8 views
1

私はカテゴリテーブルの外部キー制約が定義されてMySQLの外部キーインデックス

(InnoDBエンジン)上の外部キーCATEGORY_IDを持っているMySQLのテーブルの製品を使用しています。

私は、category_id = 1の製品からEXPLAIN SELECT *を実行すると気付きました。

それは外部キーを使用していますので、私はタイプ=レンジとキーを参照してください。my_foreign_key

をしかし、私は(1,10)はCATEGORY_ID製品からSELECT * EXPLAIN実行すると、

フルテーブルスキャンを使用します。type = ALL、Key:NULL !!!

皮肉なことに、製品からSELECT SELECT *を実行すると、category_id IN(1,2);それは型範囲とキーを使用します:My_foreign_key!

したがって、category_idが連続していない値を使用する場合に問題があると思います。

なぜでしょうか?

おかげ

答えて

4

これは多年生の質問の一の形態である「私のテーブルが大きい取得するときに、なぜMySQLはインデックスを使用して停止していますか?」基本的には、インデックスを使用することが有用でなくなり、クエリを傷つけるような過去があり、MySQLのクエリオプティマイザはこれを考慮に入れて設計されています。あなたがそれを信じていない場合は、FORCE INDEXからまでに特定のインデックスを使用して、インデックスの有無にかかわらずクエリを実行し、得られた結果を確認することができます。

(1,2)(1,10)と行動の異なるこれは私がこの用語は、キーカーディナリティと呼ばれていると考える正しいカテゴリ2が10

+0

はるかに使用頻度の高いカテゴリよりもあるので、おそらくされます。たとえば、行の90%がcategory_id = 1で、行の10%がcategory_id = 2であれば、それ以上category_idキーを使用することはありません。 (実際の数字は、mysqlがあなたのキーの使用を止めるときのための厳密で速いルールがあるとは信じていません)。 – Hardwareguy