首页 > 解决方案 > JOIN 子句的适当索引

问题描述

假设我有以下具有给定属性的表:

表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

什么索引会使这个查询受益?

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

谢谢!

标签: sql

解决方案


这个查询:

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

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

对没有WHEREGROUP BY在用于连接的列上添加索引的查询进行索引的一般建议。我会走得更远一点。

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

另一方面,如果TableA它真的很大而且TableB小得多,因此 in 中的大多数行都TableA没有匹配TableB,那么索引 onTableA(B_NUM)将是更好的索引。

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


推荐阅读