所以假设我有这个问题:
SELECT * FROM table1 A, table1 B where A.id = B.id;
即使table1上有id的索引,它仍会扫描整个表...有没有办法加快速度,以便它不扫描整个表?
答案 0 :(得分:0)
虽然我没有在您面前执行您的执行计划,但实际上这只是最有可能扫描TableA
,原因是因为TableA
没有其他条件。它应该在TableB
此时寻求,因为它是统计的。现在,如果您要为TableA
提供另一个条件,并且该条件符合索引,您会发现它没有扫描整个表。
为了进一步说明,如果TableA
上的索引是查询的覆盖索引,它实际上甚至都不会读取TableA
的数据页。
为了进一步说明,如果TableA
和TableB
之间存在外键约束,并且您没有从TableB
读取比id字段更多的内容,那么它也永远不会读取数据页。
更进一步说,即使您确实需要来自TableB
的数据,如果该数据位于索引上,它仍然不必读取数据页。
但最后,因为您选择了*
,所以这不太可能是一个非常有效的查询,因为它会从两个表中选择所有列。
我希望这不会太长,但我想确保你知道我来自哪里。