2011-08-15 43 views
0

我有一個查詢,它的工作原理與它應該一樣,但是,我想優化它以使用更少的查詢。PHP/MySQL查詢優化?

以下代碼來自我爲公告板系統創建的用戶獎牌插件。

$types = array('numposts', 'numthreads', 'numreps'); 
$medals = ""; 

foreach($types as $type) 
{ 
    $query = $db->query(" 
     SELECT u.*, m.* 
     FROM ".TABLE_PREFIX."medals_".$type." m 
     LEFT JOIN ".TABLE_PREFIX."medals u ON (m.".$type."_id=u.awid) 
     WHERE awuid='".intval($post['uid'])."' AND type='".$type."' 
     ORDER BY `".$type."` DESC LIMIT 1 
    "); 

    while($results = $db->fetch_array($query)) 
    { 
     $medals .= "<img src=\"uploads/medals/".$results['icon']."\" border=\"0\" alt=\"".$results['descrition']."\" title=\"".$results['description']."\" /> "; 
    } 
} 

對於每個帖子,它運行此查詢以顯示用戶的獎牌。根據帖子的數量,查詢乘以三倍。所以,例如,如果一個線程有10個帖子... 10x3是30 ...這30個查詢正在執行的只是這個代碼。

優化這個以減少查詢的最佳方式是什麼?也許緩存?我不太擅長優化,所以我在這裏要求您的輸入。

+0

由於「帖子數量」是更嚴重的乘數,我們是否也不應該看到該代碼? – webbiedave

回答

1

鏈接在posts表中,因此您只能爲其帖子實際顯示的用戶獲取獎牌。如果單獨運行此查詢,則每個用戶只能獲得1枚獎牌列表記錄,您可以將其存儲在數組或其他變量中。

當您開始顯示帖子時,您可以返回獎牌列表並提取用戶的獎牌。如果(比如說)你的10個帖子只有2個人在聊天,這會花費你一個單獨的查詢,獲取2x3 = 6行數據(2個用戶x 3種獎章),以及一些存儲獎牌結果的內存獲取/顯示帖子。

+0

這只是一個插件...帖子表已經通過公告板的核心代碼鏈接了。而且它只獲取正在顯示帖子的用戶的獎牌,但是它會爲每個帖子執行此查詢。我想以某種方式只對每個屬於線程一部分的用戶執行一次這個查詢。 – Spencer

+0

如果您無法向上移動代碼並將其附加到後置代碼,請使用靜態var存儲用戶ID及其獎牌數據。只有在用戶的ID不在該靜態數組內時才執行查詢。如果是,則返回數組數據。否則讀取數據,將其存儲在數組中,然後返回數組數據。 –

+0

請問您能多說明一下嗎?也許提供一個示例代碼。 – Spencer