MySql外键索引

MySql外键索引,mysql,database,indexing,foreign-keys,innodb,Mysql,Database,Indexing,Foreign Keys,Innodb,我使用的是Mysql表产品,它在categories表上有一个外键category_id 定义了外键约束(Innodb引擎) 我注意到,当我运行EXPLAIN SELECT*from products时,category_id=1 它使用外键,所以我看到type=Range和key:my_foreign_key 但当我运行EXPLAIN SELECT*时,它来自于(1,10)中的category_id所在的产品 它使用全表扫描:type=ALL,Key:NULL 具有讽刺意味的是,当我解释SEL

我使用的是Mysql表产品,它在categories表上有一个外键category_id

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

我注意到,当我运行EXPLAIN SELECT*from products时,category_id=1

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

但当我运行EXPLAIN SELECT*时,它来自于(1,10)中的category_id所在的产品

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

具有讽刺意味的是,当我解释SELECT*时,从(1,2)中的category_id所在的产品中;它使用类型范围和键:My_foreign_Key

因此,我想当category_id使用不连续的值时会出现问题

你知道为什么吗


感谢

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


(1,2)
(1,10)
在行为上的不同可能是因为类别2比类别10使用得更频繁。

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


(1,2)
(1,10)
在行为上的不同可能是因为类别2比类别10使用得更频繁。

这是正确的,我认为这个术语被称为关键基数。例如,如果90%的行是category_id=1,而10%的行是category_id=2,那么它就不再麻烦使用category_id键了。(实际数字是虚构的,我不认为mysql停止使用密钥有一个硬性规定)。这是正确的,我认为这个术语叫做密钥基数。例如,如果90%的行是category_id=1,而10%的行是category_id=2,那么它就不再麻烦使用category_id键了。(实际数字是虚构的,我不相信mysql何时停止使用您的密钥有一个硬性规定)。