在外键关系中进行内连接时应使用哪些索引

时间:2016-05-10 11:15:28

标签: mysql indexing inner-join

数据库:MySql

我有两个表Student,由外键关系链接的类如下:

create table class
(
id int(10) not null,
primary key(id)
);

create table Student(
id int(10) not null,
cid int(10) not null,
constraint foreign key(cid) references class(id)
);

这两个表都有6000多行。

现在,当我进行内连接时,如下所示:

select * from Student inner join class on Student.ci = class.id

解释计划似乎只在表格上使用索引。它在其他上使用全表扫描。我认为它应该在两个表上使用索引。

索引显示在EXPLAIN PLAN中的可能键中但未使用...

1 个答案:

答案 0 :(得分:0)

执行SHOW CREATE TABLE以查看为您构建的索引。

对于这一个查询(select * from Student inner join class on Student.ci = class.id),您需要

Student:  INDEX(ci)  and/or
class:    INDEX(id)

由于PRIMARY KEY是一个索引,因此您已经拥有class所需的内容。

为什么"全扫描"?因为你没有给出一个WHERE条款来说你想要一个小于完整扫描的东西。

对于类似的查询,优化程序将

  • 对其中一个表执行表扫描,
  • 对于该表中的每一行,最好使用索引到达另一个表。 ("嵌套循环加入")。

这是执行该查询的最佳方式。

EXPLAIN说"使用索引"这意味着它正在使用"覆盖索引"。这就是可以在索引中完成所有工作,而无需查看数据。

(如果你向我们展示了EXPLAIN,我可以更明确。