2014-05-15 38 views
0

我在我的網站上顯示圖片及其詳細信息,但是最近網站的加載速度很慢。高效的Foreach循環查詢數據庫

最主要的是這個foreach循環循環100次,在網格中顯示100個帖子。運行需要14秒

foreach($posts as $post) { 

      $hashtags[] = $this->HashTagsModel->get_hashtags($post["id"]); 
      $author[] = $this->UserModel->get_user_details($post["user_id"]); 
      $comment_count[] = $this->CommentModel->get_comments_count($post["id"]); 
      $is_favourited[] = $this->FavouriteModel->is_favourited($post["id"]); 
      $is_reposted[] = $this->RepostModel->is_reposted($post["id"]); 
      $vote_status[] = $this->vote_status($post["id"]); 
      $comments[] = $this->count_comments($post["id"]); 

     } 

我怎樣才能做到這一點,使其更有效率?這個工作在我們的網站數據庫成了巨大的

任何幫助,將不勝感激,

問候,

幾乎被解僱

+1

那麼,如果你已經懷疑增長的數據庫是原因(你可能就在那裏),那麼你無法在php級別上解決這個問題。你必須仔細看看sql語句,表格,特別是數據庫中的索引定義!因此,我們需要幫助您發佈數據庫結構和查詢。 – arkascha

+0

帶有7(+)個子查詢的100個帖子不應該花費太多時間。 我建議你檢查這7個函數中每一個函數的執行時間1.我打賭其中一個導致大部分時間問題。 –

回答

2

的有效途徑,以foreach循環查詢數據庫是沒有的foreach查詢數據庫。這是因爲您正在允許未知數量的查詢被觸發,這將導致大量排隊。如果突然增加5000個圖像會怎麼樣?你會循環所有圖像嗎?該查詢需要很長時間。

你有$信息[「身份證」]爲你在那裏可變我假設,所以你可以通過制定後的ID,像這樣的一個陣列中後做一個查詢顯著降低了這一過程:

$postids = array(); 
foreach($posts as $post) { 
    $postids[] = $post['id']; 
} 

// Selecting from 1 table 
$query = 'SELECT * FROM hashtags WHERE id IN ('. implode(",", $postids) .')'; 

這將獲取所有關於#標籤是你postids之一的#標籤的信息。這僅僅是1臺,你可能會想獲取多,不知道你的數據庫結構,我將是通用的,所以像:

// Selecting and joining data from multiple tables 
$query = ' SELECT author.name, table.col FROM posts 
LEFT JOIN author ON author.id = post.author_id 
LEFT JOIN table ON table.id = post.table_id 
WHERE posts.id IN IN ('. implode(",", $postids) .')'; 

這是比較困難的要更準確。我認爲加入表格會爲你提供更好的結果,你甚至可以加入票數/評論。如果這是不可能的,你可以查詢與你的帖子相關的所有數據,然後用PHP編寫它,然後你確切知道你有多少查詢。例如,改變你的模型接受一個數組,而不是一個單一的帖子ID,然後改變你的「WHERE POST_ID = X」到「WHERE POST_ID IN(X)」,那麼你可以這樣做:

$postids = array(); 
foreach($posts as $post) { 
    $postids[] = $post['id']; 
} 

$hashtags = $this->HashTagsModel->get_hashtags($postids); 
$author = $this->UserModel->get_user_details($postids); 
$comment_count = $this->CommentModel->get_comments_count($postids); 
$is_favourited = $this->FavouriteModel->is_favourited($postids); 
$is_reposted = $this->RepostModel->is_reposted($postids); 
$vote_status = $this->vote_status($postids); 
$comments = $this->count_comments($postids); 

這在循環之外獲取您的查詢,並且您知道只有7個SQL查詢,而不是查詢*帖子。在PHP中,您可以遍歷每個數組的結果,根據其ID分配每個數組的結果。

+0

哇這真的很有幫助!我打算做你最後的建議,但我有幾個問題。對於作者來說,我發現它只返回作者創作的帖子的一個實例。例如,作者'B'發了3篇文章,但它只是返回一次並填充訂單?有關如何做到這一點的任何建議? –

+0

不知道你的模型是如何工作的以及你想要完成的工作很難得到清晰的圖像。如果您有5個帖子ID,例如:[1,3,4,4,10],那麼當您將其傳遞給get_user_details時,它會爲每個ID找到結果,但只有帖子ID是唯一的,所以ID 4只會返回一次。從邏輯上講,它對順序無關緊要,因爲您可以循環查看結果並將數據附加到其他位置。我想知道爲什麼對於一個單一的職位,你需要知道這個職位的作者已經做了3個其他職位? – viion