Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 高效的Foreach循环查询数据库_Php_Performance_Codeigniter_Loops_Foreach - Fatal编程技术网

Php 高效的Foreach循环查询数据库

Php 高效的Foreach循环查询数据库,php,performance,codeigniter,loops,foreach,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_det

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

主要的是这个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) .')';
这将获取hashtags上的所有信息,其中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) .')';
$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);
要想更准确一点就有点困难了。我认为加入表格将为您提供更好的结果,您甚至可以加入投票/评论计数。如果这是不可能的,您可以查询与您的帖子相关的所有数据,然后在PHP中进行公式化,这样您就可以确切地知道您有多少查询。例如,将模型更改为接受数组而不是单个post ID,然后将“WHERE post_ID=x”更改为“WHERE post_ID IN(x)”,然后可以执行以下操作:

// 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) .')';
$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将每个数组分配回POST。

如果您已经怀疑是不断增长的数据库造成的(您可能就在那里),那么您无法在PHP级别上解决此问题。您必须仔细查看sql语句、表,尤其是数据库中的索引定义!因此,为了帮助您,我们必须发布您的数据库结构和查询。包含7(+)子查询的100篇文章不应该花费太多时间。我建议您逐个检查这7个函数的执行时间。我打赌其中的一个会导致大部分时间的问题。哇,这真的很有帮助!我会做你最后的建议,但是我有一些问题。对于authorOne,我发现它只返回了作者所写文章的一个实例。例如,作者“B”发了3篇文章,但它只是返回一次,然后塞满了订单?关于如何做到这一点,有什么建议吗?如果不知道你的模型是如何工作的,不知道你正在努力完成什么,就很难得到一个清晰的画面。如果您有5个post id,例如:[1、3、4、4、10],那么当您传递该id以获取_user_详细信息时,它将为每个post id查找一个结果,但仅在post id唯一的地方,因此id 4将只返回一次。从逻辑上讲,顺序无关紧要,因为您可以循环遍历结果并将数据附加到其他内容。我想知道为什么一篇文章你需要知道那篇文章的作者还写了3篇其他的文章?