SQL JOIN查询比较

时间:2018-12-03 14:47:31

标签: sql join

以下解释摘自本书:图形数据库。由Robinson,Ian,Jim Webber和Emil Eifrem撰写。在2013年的“ O'Reilly Media,Inc.”上。


说有2个表:

人员

ID, Person
1, Alice  
2, Bob  
..,..  
99, Zach 

PersonFriend

ID, Person 
1, 2   
2, 1  
2, 99  
..,..  
99,1

示例2-1。鲍勃的朋友

SELECT p1.Person 
FROM Person p1 
    JOIN PersonFriend   
        ON PersonFriend.FriendID = p1.ID  
    JOIN Person p2  
        ON PersonFriend.PersonID = p2.ID  
WHERE p2.Person = 'Bob'    

根据我们的样本数据,答案是爱丽丝和扎克。这不是特别昂贵或困难的查询,因为它使用过滤器WHERE Person.person ='Bob'限制了所考虑的行数。

友谊并不总是一种自反的关系,因此在示例2-2中,我们提出了对等查询,即“谁与鲍勃成为朋友

示例2-2。谁是鲍勃的朋友?

SELECT p1.Person 
FROM Person p1 
     JOIN PersonFriend  
        ON PersonFriend.PersonID = p1.ID 
     JOIN Person p2
        ON PersonFriend.FriendID = p2.ID 
WHERE p2.Person = 'Bob'

该查询的答案是爱丽丝;遗憾的是,扎克不认为鲍勃是朋友。这种相互查询仍然易于实现,但在数据库方面则更为昂贵,因为数据库现在必须考虑PersonFriend表中的所有行。我们可以添加一个索引,但这仍然涉及昂贵的间接层。


以上所有内容均来自本书,并非我的观点。我不懂的
1)为什么示例2-2中的查询比示例2-1中的查询昂贵?
2)为什么叫倒数查询?

1 个答案:

答案 0 :(得分:0)

  1. 我唯一会影响性能的就是索引的定义方式。
    情况1:,您唯一的索引在(PersonID, FriendID)上。我认识的所有DB都将创建B树索引作为默认索引,并且仅在PersonID上就可以将其用于搜索。结果:ON PersonFriend.PersonID = p2.ID WHERE p2.Person = 'Bob'部分可能会使用它并且速度很快。对于第二个查询,情况并非如此。
    情况2:您有2个单独的索引,在每个列(PersonID)(FriendID)上都有一个。在这种情况下,这两个查询在性能方面将是等效的(它们将仅使用每个索引)。

  2. 请勿将相互查询作为一个技术术语,因为这不是真正的术语。
    作者只是颠倒了JOIN。在第一个查询中,FriendID首先出现,PersonID其次。这给出了答案:鲍勃喜欢谁?
    相反,第二个查询首先针对PersonID进行联接,然后针对FriendID进行联接。这给出了答案:谁喜欢鲍勃? (即:友谊是相互