PHP:如何在单个查询中优化这些MySQL查询?

时间:2013-04-10 11:20:52

标签: php mysql sql

是否可以将以下内容优化为单个查询?

我在这里假设单个查询使用临时表的多个查询会更有效,所以如果我的假设不正确,请告诉我。

$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。*

2 个答案:

答案 0 :(得分:1)

  1. 无法使用mysql_query()
  2. 如果认为将3个调用合并为一个会在这种情况下保存一些明显的内容是错误的
  3. 要清楚这是一个非常普遍的错觉 - 认为一个混乱的查询运行速度比多个查询要快。它不会。

答案 1 :(得分: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

虽然没有经过测试(不知道你的桌面布局)