高效的Foreach循环查询数据库

时间:2014-05-15 06:11:29

标签: php performance codeigniter loops 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 个答案:

答案 0 :(得分:2)

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

你有 $ post [" id"] 作为我假设的where变量,所以你可以通过在制定一个post数组后做一个单独的查询来显着减少这个过程ids,像这样:

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

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

这将获取有关标签的所有信息,其中id是您的postid之一。这只是一个表,您可能想要获取多个,而不知道您的数据库结构我将是通用的,所以类似于:

// 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" to" 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将每个数组分配回帖子。