我使用的Mysql表产品在类别表
上有一个外键category_id定义了外键约束(Innodb引擎)。
我注意到当我从category_id = 1的产品中运行EXPLAIN SELECT *时;
它使用外键,所以我看到type = Range和Key:my_foreign_key
但是当我从category_id IN(1,10)的产品中运行EXPLAIN SELECT *时;
它使用全表扫描:type = ALL,Key:NULL !!!
具有讽刺意味的是,当我从category_id IN(1,2)的产品中进行EXPLAIN SELECT *时;它使用type-range和Key:My_foreign_key!
所以我认为当category_id使用不连续的值时会出现问题。
任何想法为什么?
由于
答案 0 :(得分:4)
这是长期问题的一种形式“当我的桌子变大时,为什么MySQL会停止使用索引?”基本上,有一点是使用索引停止有用并开始损害您的查询,MySQL的查询优化器旨在考虑到这一点。如果您不相信,可以使用FORCE INDEX
使使用特定索引,使用和不使用索引运行查询,并查看您获得的结果。
(1,2)
和(1,10)
的行为不同可能是因为第2类比第10类使用得多。