JOIN子句的适当索引

时间:2019-01-06 14:06:42

标签: sql

让我们说我有以下具有给定属性的表:

表A:A_ID,B_NUM,C,D 表格B:B_ID,E,F

具有以下查询:

SELECT TableA.*,TableB.E,TableB.F FROM TableA
INNER JOIN TableB ON TableA.B_NUM=TableB.B_ID

什么索引对该查询有利?

就我应该在哪里创建什么索引而言,我很难理解这个主题。

谢谢!

1 个答案:

答案 0 :(得分:1)

此查询:

SELECT a.*, b.E, b.F
FROM TableA a INNER JOIN
     TableB b
     ON a.B_NUM = b.B_ID;

返回两个表之间匹配的所有数据。

为没有WHEREGROUP BY的查询建立索引的一般建议是在用于联接的列上添加索引。我走得更远。

我对最佳索引的第一个猜测是在TableB(b_id, e, f)上。这是TableB的覆盖索引。这意味着SQL引擎可以使用索引来获取ef。它不需要转到数据页面。索引较大,但是不需要数据页。 (在大多数数据库中都是这样;有时行锁定的考虑使事情变得更加复杂。)

另一方面,如果TableA确实很大而TableB很小,因此TableA中的大多数行在TableB中都不匹配,则{{ 1}}将是更好的索引。

您可以同时包含两个索引,然后让优化器决定使用哪个索引(优化器可能会决定同时使用两个索引,但是我认为这不太可能)。