2009-06-09 91 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