1

カテゴリテーブルに外部キーcategory_idを持つMysqlテーブルproductsを使用しています

外部キー制約が定義されています (Innodb エンジン)。

EXPLAIN SELECT * from products where category_id=1; を実行すると気付きました。

外部キーを使用するため、 type=Range と Key: my_foreign_key が表示されます

しかし、EXPLAIN SELECT * from products where category_id IN (1,10); を実行すると、

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

皮肉なことに、EXPLAIN SELECT * from products where category_id IN (1,2); を実行すると、type-range と Key: My_foreign_key を使用します!

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

理由はありますか?

ありがとう

4

1 に答える 1

4

これは、「テーブルが大きくなると、MySQL がインデックスの使用を停止するのはなぜですか?」という長年の疑問の 1 つです。基本的に、インデックスの使用が役に立たなくなり、クエリに悪影響を及ぼし始めるポイントがあり、MySQL のクエリ オプティマイザーはそれを考慮に入れるように設計されています。信じられない場合は、 を使用FORCE INDEX特定のインデックスを使用し、インデックスを使用してクエリを実行し、インデックスを使用せずにクエリを実行して、得られる結果を確認できます。

(1,2)との動作の違い(1,10)は、おそらくカテゴリ 2 がカテゴリ 10 よりもはるかに頻繁に使用されるためです。

于 2009-06-09T16:27:28.950 に答える