据我所知,使用索引可以帮助加快两个或更多表的连接速度。以下示例使用共享的department_id列连接两个表,emps和depts:
select last_name, department_name
from emps join depts
using(department_id);
我的问题是:将索引两个表中的一个上的department_id列加速此查询,还是我必须在两个表的两个department_id列上创建一个索引才能看到性能的提高?
答案 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
。那里有太多的约定和魔法:)