以下解释摘自本书:图形数据库。由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)为什么叫倒数查询?
答案 0 :(得分:0)
我唯一会影响性能的就是索引的定义方式。
情况1:,您唯一的索引在(PersonID, FriendID)
上。我认识的所有DB都将创建B树索引作为默认索引,并且仅在PersonID
上就可以将其用于搜索。结果:ON PersonFriend.PersonID = p2.ID WHERE p2.Person = 'Bob'
部分可能会使用它并且速度很快。对于第二个查询,情况并非如此。
情况2:您有2个单独的索引,在每个列(PersonID)
和(FriendID)
上都有一个。在这种情况下,这两个查询在性能方面将是等效的(它们将仅使用每个索引)。
请勿将相互查询作为一个技术术语,因为这不是真正的术语。
作者只是颠倒了JOIN
。在第一个查询中,FriendID
首先出现,PersonID
其次。这给出了答案:鲍勃喜欢谁?
相反,第二个查询首先针对PersonID
进行联接,然后针对FriendID
进行联接。这给出了答案:谁喜欢鲍勃? (即:友谊是相互)