让我们说我有以下具有给定属性的表:
表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
什么索引对该查询有利?
就我应该在哪里创建什么索引而言,我很难理解这个主题。
谢谢!
答案 0 :(得分:1)
此查询:
SELECT a.*, b.E, b.F
FROM TableA a INNER JOIN
TableB b
ON a.B_NUM = b.B_ID;
返回两个表之间匹配的所有数据。
为没有WHERE
或GROUP BY
的查询建立索引的一般建议是在用于联接的列上添加索引。我走得更远。
我对最佳索引的第一个猜测是在TableB(b_id, e, f)
上。这是TableB
的覆盖索引。这意味着SQL引擎可以使用索引来获取e
和f
。它不需要转到数据页面。索引较大,但是不需要数据页。 (在大多数数据库中都是这样;有时行锁定的考虑使事情变得更加复杂。)
另一方面,如果TableA
确实很大而TableB
很小,因此TableA
中的大多数行在TableB
中都不匹配,则{{ 1}}将是更好的索引。
您可以同时包含两个索引,然后让优化器决定使用哪个索引(优化器可能会决定同时使用两个索引,但是我认为这不太可能)。