Mysql 在外键关系中进行内部联接时应该使用哪些索引

Mysql 在外键关系中进行内部联接时应该使用哪些索引,mysql,indexing,inner-join,Mysql,Indexing,Inner Join,数据库:MySql 我有两个表,学生,班级通过外键关系链接如下: 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) ); select * from Student inner join clas

数据库:MySql

我有两个表,学生,班级通过外键关系链接如下:

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)
);
select * from Student inner join class on Student.ci = class.id
这两个表都有6000多行

现在,当我进行如下内部联接时:

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)
);
select * from Student inner join class on Student.ci = class.id
解释计划似乎只在表上使用索引&它在其他表上使用全表扫描。我认为它应该在两个表上都使用索引


索引显示在解释计划中的可能键中,但未使用…

Do
SHOW CREATE TABLE
查看为您构建了哪些索引

对于这一查询(
select*from Student.ci=class.id上的Student internal join class
),您需要

Student:  INDEX(ci)  and/or
class:    INDEX(id)
由于
主键
是索引,因此您已经拥有了
上所需的内容

为什么要进行“全面扫描”?因为您没有给出一个
WHERE
子句来表示您想要的不是完整扫描

对于这样的查询,优化器将

  • 对其中一个表进行表扫描,然后
  • 对于该表中的每一行,请转到另一个表,最好使用索引。(“嵌套循环联接”)
这是执行该查询的最佳方式

EXPLAIN
显示“使用索引”时,表示它正在使用“覆盖索引”。这就是在索引中可以完成的所有工作,而无需查看数据


(如果您向我们展示了
EXPLAIN
,我可以说得更清楚。`

Do
SHOW CREATE TABLE
,查看为您构建了哪些索引

对于这一查询(
select*from Student.ci=class.id上的Student internal join class
),您需要

Student:  INDEX(ci)  and/or
class:    INDEX(id)
由于
主键
是索引,因此您已经拥有了
上所需的内容

为什么要进行“完全扫描”?因为您没有给出
WHERE
子句来说明您想要的不是完全扫描

对于这样的查询,优化器将

  • 对其中一个表进行表扫描,然后
  • 对于该表中的每一行,请转到另一个表,最好使用索引(“嵌套循环联接”)
这是执行该查询的最佳方式

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


(如果您向我们展示了
EXPLAIN
,我可以说得更清楚。`

索引不用于少量行,因为使用它是毫无意义的。如果行数较多,索引实际上有助于检查较少的行,则将使用它。请尝试用数十万条记录填充数据库并再次测试。SQL server使用“统计数字"确定查询的最佳运行方式。查询优化程序实际上非常聪明,如果它决定使用索引的成本高于访问表的成本,它将访问表。有没有提示说由于行数较少而没有使用索引?我尝试了6000多行,但仍然只使用了一个索引…不是吗这里有学生表上的索引吗?索引不用于少量的行,因为使用它是毫无意义的。对于较大的行,索引实际上有助于检查较少的行,它将被使用。请尝试用几十万条记录填充数据库,然后再次测试。SQL server使用“统计信息”确定查询的最佳运行方式。查询优化程序实际上非常聪明,如果它决定使用索引的成本高于访问表的成本,它将访问表。有没有提示说由于行数较少而没有使用索引?我尝试了6000多行,但仍然只使用了一个索引…不是吗这里有学生表上的索引吗?