2013-04-10 94 views
1

是否可以将以下内容优化为单个查询?PHP:如何在单个查询中优化这些MySQL查询?

我在这里假设一个查询会更有效,多个查询使用临时表,所以请让我知道如果我的假设是不正确的。

$id是当前memberid。 $list是要从最终结果中删除的itemid列表(例如已下载的项目)。

这个查询应该做什么查找已经下载了与$id成员类似项目的前500名成员。然后找到这些成员已下载的所有项目,并根据每个成员的类似下载数量和每个项目的总下载次数进行排名。因此最终结果是$id成员的建议清单。

的查询是:

mysql_query('CREATE TEMPORARY TABLE temp1 ENGINE=MEMORY AS 
(SELECT a.memberid, COUNT(*) `score` FROM table_downloads a INNER JOIN 
(SELECT itemid FROM table_downloads WHERE memberid='.$id.') b ON a.itemid = b.itemid 
WHERE a.memberid!='.$id.' GROUP BY a.memberid HAVING score>0 ORDER BY score DESC LIMIT 500)'); 

$res=mysql_query('SELECT table_downloads.itemid,COUNT(table_downloads.itemid*temp1.score) AS score2 
FROM table_downloads,temp1 
WHERE table_downloads.memberid=temp1.memberid AND table_downloads.itemid NOT IN ('.$list.') 
GROUP BY table_downloads.itemid 
ORDER BY score2 DESC LIMIT 30'); 

mysql_query('DROP TABLE temp1'); 

这是可能的,这种查询可能要花很长时间为不可用,如果有几百万行。任何建议,以确保它很快执行也将不胜感激。

* 我正在故意使用mysql_query。请不要告诉我使用的mysqli。*

+0

可以随时加入琴弦,用分号隔开(',')。 – 2013-04-10 11:22:27

+0

“我假设在这里单个查询会更有效,多个查询使用临时表”---你为什么这么认为?尝试用剪刀剪下整本书。然后尝试一个又一个的单页。哪个会更有效率? – zerkms 2013-04-10 11:23:20

+0

如果你的查询是可读的,那真的会有帮助;) – 2013-04-10 11:24:08

回答

1
  1. 这是不可能做mysql_query()
  2. 它认为,加入3个电话到一个可以节省一些明显在这种情况下,错误

而且要清楚这是一个非常普遍的错觉 - 认为一个混乱的查询会比多个查询运行得更快。它不会。

+0

除了这个答案:将查询发送到SQL服务器只需要几毫秒。运行查询需要很长时间。通过一次发送所有三个查询,您可以节省数毫秒。改为优化您的SQL查询。 – 2013-04-10 11:31:04

0

出于兴趣,我玩了一玩。

我认为这是可能的,虽然不漂亮,我怀疑比你当前的脚本慢。

SELECT table_downloads.itemid, COUNT(table_downloads.itemid * temp1.score) AS score2 
FROM table_downloads 
INNER JOIN (SELECT a.memberid, COUNT(*) `score` 
      FROM table_downloads a 
      INNER JOIN table_downloads b 
      ON a.itemid = b.itemid AND b.memberid='.$id.' AND a.memberid=b.memberid 
      GROUP BY a.memberid 
      ORDER BY score DESC 
      LIMIT 500) temp1 
ON table_downloads.memberid = temp1.memberid 
WHERE table_downloads.itemid NOT IN ('.$list.') 
GROUP BY table_downloads.itemid 
ORDER BY score2 DESC 
LIMIT 30 

不是真的,虽然测试(不知道你的表格布局)