2009-06-09 87 views
1

我正在使用一個Mysql表產品,它具有一個外鍵category_id在類別表MySql外鍵索引

外鍵約束被定義(Innodb引擎)。

我注意到,當我從產品where category_id = 1運行EXPLAIN SELECT *時;

它使用外鍵,所以我看到類型=範圍和重點:my_foreign_key

但是當我運行從產品EXPLAIN SELECT *其中CATEGORY_ID IN(1,10);

它使用全表掃描:type = ALL,Key:NULL !!!具有諷刺意味的是,當我做EXPLAIN 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 2009-06-09 16:36:07