MySQL和PHP-多行或连接成一行-哪个更快?

MySQL和PHP-多行或连接成一行-哪个更快?,php,mysql,string,concatenation,Php,Mysql,String,Concatenation,当为一个用户存储关系数据(每个用户可能有1000个朋友)时,为每个关系创建一个新行,或者将他们的所有朋友连接到一个字符串中,然后稍后解析该字符串会更快吗 即 其中,ID是对“用户”表中主ID的引用 或者“用户”表中有一个名为friends的列,该列可能如下所示: Primary id | Friend1ID | 我理解字符串连接和解析通常非常慢,所以我倾向于使用第一种方法。然而,随着用户数量的增长,这就变成了选择一行并对其进行解析的情况,即在数百万行中搜索符合WHE

当为一个用户存储关系数据(每个用户可能有1000个朋友)时,为每个关系创建一个新行,或者将他们的所有朋友连接到一个字符串中,然后稍后解析该字符串会更快吗


其中,ID是对“用户”表中主ID的引用

或者“用户”表中有一个名为friends的列,该列可能如下所示:

Primary id  |           Friend1ID  |

我理解字符串连接和解析通常非常慢,所以我倾向于使用第一种方法。然而,随着用户数量的增长,这就变成了选择一行并对其进行解析的情况,即在数百万行中搜索符合WHERE条件的行

一种方法明显比另一种快吗?尤其是随着用户数量的增长。

。。。要求更“正确”的方法本身就是错误的。 这取决于具体情况

如果您对web应用程序的访问率较低,且行数较多,则不会改变硬币的另一面(我不是英国人),在大型和中型应用程序访问方面,最好尽可能少地访问数据库

如您所想,要获得这个值,您可以连接这些值,然后在用户登录时拆分它们,然后将所有内容放入
$\u会话
supervar

至少我是这么想的。

。。。要求更“正确”的方法本身就是错误的。 这取决于具体情况

如果您对web应用程序的访问率较低,且行数较多,则不会改变硬币的另一面(我不是英国人),在大型和中型应用程序访问方面,最好尽可能少地访问数据库

如您所想,要获得这个值,您可以连接这些值,然后在用户登录时拆分它们,然后将所有内容放入
$\u会话
supervar


至少我是这么想的。

你应该用第二张桌子来存放朋友

Users Table
----------
userid | username
1      | Bob
2      | Mike
3      | John

Users Friends Table
--------------------
userid | friend_id
1      | 2
3      | 2
在这里你可以看到迈克和鲍勃、约翰都是朋友。。。。这当然是一个非常简单的演示

你的第二个选择将无法扩展,有些人可能有数十万个朋友,将每个Id存储在一个字段中会让人头疼。添加好友,删除好友。解决人与人之间的复杂关系。头上有很多


使用WHERE子句在正确索引的表上查询数百万条记录所需的时间不应超过一秒钟,第一个选项更好。

您应该使用第二个表来存储好友

Users Table
----------
userid | username
1      | Bob
2      | Mike
3      | John

Users Friends Table
--------------------
userid | friend_id
1      | 2
3      | 2
在这里你可以看到迈克和鲍勃、约翰都是朋友。。。。这当然是一个非常简单的演示

你的第二个选择将无法扩展,有些人可能有数十万个朋友,将每个Id存储在一个字段中会让人头疼。添加好友,删除好友。解决人与人之间的复杂关系。头上有很多

在正确索引的表上使用WHERE子句查询数百万条记录不应超过一秒钟,第一个选项更好。

正确的方法可能是保留多行。这使得统计分析和更复杂的查询(比如朋友的朋友)变得更容易,而不需要任何黑客的东西。整数存储大小通常也比字符串存储小,即使您重复一个ID,尤其是如果您使用大小适当的整数存储(如mediumint)

它的可维护性、可扩展性(如果他们开始有很多朋友的话)以及可导出和导入性都更强。从连接中获得的速度增益,如果有的话,将不值得其他的好处

例如,如果您希望搜索Bob是否是Jane的朋友,那么这将是多行实现中的单行查找,或者是在单行实现中:获取Bob的行、解码字段、循环字段查找Jane-找到Jane。DBMS优化和索引将使多行实现在这种情况下更快——如果主键为(id,friendid),那么它将是非常即时的,因为表可能会在该键上散列。

正确的方法可能是保留多行。这使得统计分析和更复杂的查询(比如朋友的朋友)变得更容易,而不需要任何黑客的东西。整数存储大小通常也比字符串存储小,即使您重复一个ID,尤其是如果您使用大小适当的整数存储(如mediumint)

它的可维护性、可扩展性(如果他们开始有很多朋友的话)以及可导出和导入性都更强。从连接中获得的速度增益,如果有的话,将不值得其他的好处


例如,如果您希望搜索Bob是否是Jane的朋友,那么这将是多行实现中的单行查找,或者是在单行实现中:获取Bob的行、解码字段、循环字段查找Jane-找到Jane。DBMS优化和索引将使多行实现在这种情况下更快—如果主键为(id,friendid),那么它将是非常即时的,因为表可能会在该键上散列。

我认为正确的方法是两行一列的表,速度可能更快

      user | friend
      1    |   2
      1    |   3
这将很简单,并将使酷儿和更新更容易,你可以有很多关系,因为你想


不要把问题过分复杂化…

我认为正确的方法是两行两列表,这可能会更快

      user | friend
      1    |   2
      1    |   3
这将很简单,并将使酷儿和更新更容易,你可以有很多关系,因为你想


不要使问题过于复杂…

我认为第二种方法更有意义,尤其是如果有
      user | friend
      1    |   2
      1    |   3