2013-04-10 111 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 

不是真的,雖然測試(不知道你的表格佈局)