0

以下哪种 mysql 存储方法查询起来会更快(检索特定用户的朋友说@anyid):

Table: Friends

Columns: friend1 friend2

每个友谊和查询只插入一行

select friend1 
from FRIENDS 
where friend2=@anyid
UNION ALL
select friend2 
from FRIENDS 
where friend1=@anyid

或者

每个友谊插入两行(插入为friend1friend2,然后插入交换的条目,例如1,2和2,1),然后简单地查询为

select friend2 from FRIENDS where friend1=@anyid

对我来说,第二种方法似乎会表现得更好,因为它只需要对单个列friend1 和单个查询进行索引。第一种方法可能需要对两个列都进行索引,并且需要运行两个子查询。但在一些帖子中,我看到人们声称第一种方法可能会表现得更好。从好的方面来说,与第二种方法相比,第一种方法将占用一半的存储空间,这对于数百万条记录会产生巨大的影响。

还有一件事,是否需要单独存储上述两种方法中的任何一种relationship_idcreation_date除了给我建立关系的时间或顺序之外,我还能得到什么特别的好处,我认为大多数人应该能够没有它而生活?

感谢您的任何回答!

4

1 回答 1

3

对我来说,基本问题是:“数据库中有多少朋友?” 如果只有A和B是朋友,是数字“1”还是“2”。这个答案决定了您如何理解友谊实体以及应该如何实施它。

这两种方法肯定是有区别的。第一种方法统计好友数:

select count(*)
from friends
where USERID in (friend1, friend2);

相对:

select count(*)
from friends
where USERID = friend1;

第二个可以更轻松地利用索引,friend1并且可以优化为比第一个更快。

另一方面,插入一条记录需要两倍的时间。寻找朋友的朋友(等等)需要处理更多的数据,因此需要更多的处理时间。

友谊关系确实具有其他特征,例如谁发起了请求(这通常是friend1第一种方法)。或者请求和接受友谊的时间。这些附加信息表明了消除数据重复的第一种方法。

换句话说,关于数据结构的问题——与几乎所有此类问题一样——由您如何理解实体以及如何使用它们来回答。

于 2013-07-05T14:21:29.687 回答