为SQL查询选择最佳索引

时间:2019-03-17 12:49:50

标签: sql mysqli indexing

我在数据库管理课程中正在做一些问题设置,但无法弄清楚这个特定问题。

我们具有以下关系:

Emp (id, name, age, sal, ...)

以及以下查询:

SELECT id
FROM Emp
WHERE age > (select max(sal) from Emp);

然后我们应该选择一个索引,它将成为一个很好的查询优化器。我的答案是只使用Emp(age),但问题的解决方案是

Emp(age)

Emp(sal)

为什么会有2个索引?我似乎无法确定为什么您需要的不仅仅是age属性。

2 个答案:

答案 0 :(得分:1)

您需要两个索引才能获得最佳性能

1)子查询(从Emp中选择max(sal))将从索引Emp(sal)中受益,因为在树索引上,检索max会更快

2)外部查询需要对Emp(age)进行过滤,因此也可以从树索引中受益

答案 1 :(得分:1)

当然,您意识到查询是荒谬的,将agesal(可能是薪水)进行比较。也就是说,两个索引适用于:

SELECT e.id
FROM Emp e
WHERE e.age > (select max(e2.sal) from Emp e2);

我添加了表别名以强调查询两次引用了Emp表。

要从表中获取最大的sal,您需要在emp(sal)上建立索引。最大值是一个简单的索引查找操作。

然后,您要将其与age进行比较。好吧,为了与age进行比较,您需要在emp(age)上建立索引。这是对emp的完全独立引用,没有对sal的引用,因此您不能将两列放在一个索引中。

可能不需要age上的索引。查询可能返回很多行-返回很多行的表通常不能从二级索引中受益。可以从索引中受益的一种情况是,如果age聚集的索引(即,通常是主键中的第一列)。但是,我不建议使用这种索引结构。