的有效途徑,以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分配每個數組的結果。
那麼,如果你已經懷疑增長的數據庫是原因(你可能就在那裏),那麼你無法在php級別上解決這個問題。你必須仔細看看sql語句,表格,特別是數據庫中的索引定義!因此,我們需要幫助您發佈數據庫結構和查詢。 – arkascha
帶有7(+)個子查詢的100個帖子不應該花費太多時間。 我建議你檢查這7個函數中每一個函數的執行時間1.我打賭其中一個導致大部分時間問題。 –