1

我正在使用一个 Mysql 表产品,它在类别表上有一个外键 category_id

定义了外键约束(Innodb 引擎)。

我注意到当我从 category_id=1; 的产品中运行 EXPLAIN SELECT * 时

它使用外键,所以我看到 type=Range 和 Key: my_foreign_key

但是当我运行 EXPLAIN SELECT * from products where category_id IN (1,10);

它使用全表扫描:type=ALL, Key:NULL!!!

具有讽刺意味的是,当我从 category_id IN (1,2); 的产品中执行 EXPLAIN SELECT * 时 它使用类型范围和键:My_foreign_key!

所以我想当 category_id 使用不连续的值时会出现问题。

任何想法为什么?

谢谢

4

1 回答 1

4

这是一个长期存在的问题“为什么当我的表变大时 MySQL 会停止使用索引?”的一种形式。基本上,过去使用索引不再有用并开始损害您的查询,而 MySQL 的查询优化器旨在考虑到这一点。如果您不相信,您可以使用FORCE INDEX使其使用特定索引,在有或没有索引的情况下运行您的查询,看看您会得到什么结果。

(1,2)和的行为不同(1,10)可能是因为类别 2 比类别 10 使用得更多。

于 2009-06-09T16:27:28.950 回答