这两个表自然会在department_id 上有一个索引,因为这应该是depts 主键和emps 外键。
不过,在您的查询中,不太可能使用索引。当最终要读取所有记录时,为什么 DBMS 还要费心扫描索引树?例如,简单的顺序全表扫描然后连接哈希通常会快得多。
让我们看另一个例子:
select e.last_name, d.department_name
from emps e
join depts d on d.department_id = e.department_id
where e.first_name = 'Laura';
在这里,我们只对少数员工感兴趣。这就是索引发挥作用的地方。我们需要emps(first_name) 的索引。然后我们会知道员工记录,department_id,我们可以访问关联的dept 记录。
但是说到这里,我们注意到我们使用索引来查找表记录来查找department_id。从索引中获取department_id 不是更快吗?是的。所以索引应该在emps(first_name, department_id)。
depts的主键是department_id,所以这列被索引了,我们可以很容易地找到depts的记录与部门名称。
但是我们可以再次问同样的问题:我们不能也从索引中获得名称吗?这导致我们覆盖包含查询中使用的所有列的索引。
所以,虽然
index idx_emps on emps(first_name, department_id)
index idx_depts on depts(department_id)
足够了,我们可以使用这些覆盖索引更快地进行查询:
index idx_emps on emps(first_name, department_id, last_name)
index idx_depts on depts(department_id, department_name)