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

时间:2012-12-31 22:04:09

标签: php sql arrays comparison duplicates

  

可能重复:
  When to use a query or code

我有一个庞大的用户数据库及其详细信息。我想找到所有彼此最相似的人。 哪种方式比较适合? 直接编写SQL查询,以便他们在数据库中进行操作以检索已过滤(匹配)的记录。要么 首先在php&amp ;;中检索数组中的原始数据然后对该阵列应用比较操作? 假设我有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}

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

1 个答案:

答案 0 :(得分:5)

假设您在表格中表示友谊:

Table: friendships
from_id  |  to_id
----------------------------
      a  |      a
      a  |      b
      a  |      r
      a  |      c
 ...etc...
      b  |      x
      b  |      y
      b  |      z
 ...etc...

现在您可以编写一个查询来回答您的问题(在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;

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

  1. 如果将from_id和to_id编入索引,则RDBMS可能不需要触及每一行
  2. 返回所有记录将确保您触摸每一行并导致php代码消耗大量内存(这会增加内存分配的开销,并且如果RAM耗尽,将会导致致命的爬行速度变慢)。
  3. 一旦你的php代码有数据,它就不可能以比SQL更快的速度执行计算的各个步骤。
  4. 除非你的php代码有一些东西来补偿这些缺点(比如一个复杂度较低的算法,无法在SQL中表达,或者调用一些专门的C代码,例如图像处理),它通常会是更快地将工作保持在RDBMS中尽可能多。