高效的Foreach循环查询数据库


Efficient Foreach loop querying database

我正在我的网站上显示图像及其详细信息,但是最近该网站加载速度很慢。

最主要的是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"]);
        }

我怎样做才能使它更有效率?在我们的网站数据库变得庞大之前,这是可行的

任何帮助都将不胜感激,

问候,

几乎被

foreach循环查询数据库的有效方法是不foreach查询数据库。这是因为您允许触发未知数量的查询,这将导致大量排队。如果突然添加了5000张图片,您会循环遍历它们吗?这个查询将花费很长时间。

您有$post["id"]作为您的where变量,我假设,所以您可以通过在制定一个post id数组后进行单个查询来显着减少此过程,如下所示:

$postids = array();
foreach($posts as $post) {
    $postids[] = $post['id'];
}
// Selecting from 1 table
$query = 'SELECT * FROM hashtags WHERE id IN ('. implode(",", $postids) .')';

这将获取id是您的一个帖子的hashtag上的所有信息。这只是一个表,你可能想要获取多个,不知道你的数据库结构我将是通用的,像这样:

// 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中制定它,然后您确切地知道您有多少查询。例如,更改模型以接受数组而不是单个post 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将每个数组分配回posts。