加快与索引的联接

时间:2018-06-14 12:10:31

标签: sql indexing

据我所知,使用索引可以帮助加快两个或更多表的连接速度。以下示例使用共享的department_id列连接两个表,emps和depts:

select last_name, department_name 
from emps join depts 
using(department_id);

我的问题是:将索引两个表中的一个上的department_id列加速此查询,还是我必须在两个表的两个department_id列上创建一个索引才能看到性能的提高?

2 个答案:

答案 0 :(得分:2)

这两个表自然会在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)

答案 1 :(得分:0)

当数据库强制执行一致性和完整性时,您应始终索引pk和fks以减少阻塞和争用。

我还建议明确加入,而不是USING。那里有太多的约定和魔法:)