哪个更好,使用SQL查询进行数据操作或在php中操作数组中的数据?

Fai*_*zan 2 php sql arrays comparison duplicates

可能重复:
何时使用查询或代码

我有一个庞大的用户数据库及其详细信息.我想找到所有彼此最相似的人.哪种方式比较适合?直接编写SQL查询,以便他们在数据库中进行操作以检索已过滤(匹配)的记录.或者首先在php中的数组中检索原始数据然后在该数组上应用比较操作?假设我有1000个用户,我想找到最多的朋友.

UserA has {a,b,r,c,g,h,r,q,l}
UserB has {x,y,z}
UserC has {a,c,r,g,q}
.
.
.
UserN has{x,y....n}
Run Code Online (Sandbox Code Playgroud)

所以我想找到与UserA最友好的用户.比如将UserA的每个元素与整个数据库中所有用户数组的所有元素进行比较?在上述情况下,UserC应该是UserA最相似的用户.我不知道如何做到这一点.

ant*_*ome 5

假设您在表中表示友谊,如下所示:

Table: friendships
from_id  |  to_id
----------------------------
      a  |      a
      a  |      b
      a  |      r
      a  |      c
 ...etc...
      b  |      x
      b  |      y
      b  |      z
 ...etc...
Run Code Online (Sandbox Code Playgroud)

现在您可以编写一个查询来回答您的问题(在MySQL中测试):

SELECT user_id AS user_id_with_most_common_friends, MAX(cnt) AS number_of_common_friends FROM 
  (SELECT f2.from_id AS user_id, COUNT(*) AS cnt
   FROM friendships f1
   JOIN friendships f2 ON (f1.to_id = f2.to_id AND f2.from_id <> 'a')
   WHERE f1.from_id = 'a'
   GROUP BY f2.from_id) totals;
Run Code Online (Sandbox Code Playgroud)

至于性能问题,在您的特定情况下进行经验测试将给出最可靠的答案,但对于大型数据库,我希望使用上述SQL查询比查询每一行并在PHP中计算结果要快得多,原因如下:

  1. 如果将from_id和to_id编入索引,则RDBMS可能不需要触及每一行
  2. 返回所有记录将确保您触摸每一行并导致PHP代码消耗大量内存(这会增加内存分配的开销,并且如果RAM耗尽,则会使速度变慢到致命的爬行).
  3. 一旦你的php代码有数据,它就不可能比SQL更快地执行计算的各个步骤.

除非你的PHP代码有一些东西可以弥补这些缺点(比如一个复杂程度较低的算法,无法在SQL中表达,或者调用一些专门的C代码,例如图像处理),所以通常会更快尽可能在RDBMS内部工作.