【问题标题】:Querying inside of a for loop在 for 循环内查询
【发布时间】:2013-03-13 05:36:54
【问题描述】:

我想知道是否有一种方法可以更有效地完成我正在做的事情。现在,我有一个从数据库中检索状态的类。这很简单,应该不会对性能产生太大影响。

public function get ($var1, $var2, $var3)
{
    $feed = array(); //Initialize an empty array
    //Query the database
    $Statement = $this->Database->prepare("SELECT id, name, excerpt, post, timestamp, tags, title FROM posts WHERE col1 = ? AND col2 = ? AND col3 = ? ORDER BY id DESC LIMIT 15");
    $Statement->execute(array($var1, $var2, $var3));

    while($row = $Statement->fetch(PDO::FETCH_ASSOC))
    {
        $posts[] = array( "id" => $row["id"], /*etc...*/ ); 
    }

    return $posts;
} //end get

然后我的页面设置了这样的东西,我知道这根本没有效率:

<?php for ($count = 1; $count <= $total; $count++): //Display the calendar      
    echo $count;            
    $feed = $Feed->get($count, $total, $var3);

    foreach ($feed as $post): 
        echo $post["id"];           
    endforeach; 
endfor; ?>

我希望这是有道理的。那里有更多的 html 和所有内容。现在我的数据库中只有 18 行,加载页面需要 10 秒。这真的很糟糕。由于网站的设计,我必须以这种方式进行设置。所以 foreach 循环必须在 for 循环中,因为整个事情都设置为日历。

我的问题是选择所有行,将它们保存在 for 循环之外然后使用该数组是否会更有效,还是以我的方式在 foreach 循环中运行每个查询是否更好现在就这样做(我读过很多书,并且知道大多数人都说这是一个巨大的不,不)。如果我使用前一个选项并且数据库中有一百万行,我会遇到什么样的问题。

我希望这是有道理的。如果没有,我会更新问题。现在虽然大约 30 个查询只访问 1 或 2 行。但我能想到的唯一其他选择是选择表中的所有行,然后使用该数组,但如果数据库中有 100 万行,我觉得这会影响性能更多。

我是对的,有哪些解决方案?谢谢

【问题讨论】:

  • 不是一个答案,但我可以提一下(一次)让某人使用 PDO(带有准备好的语句)而不是 mysql_* 是多么好的。
  • 通常最好限制对一个数据库的查询量。每个数据库交互都需要关键的毫秒......但您还必须平衡将通过套接字传递的杂散数据量,以便进行更通用的查询。也 +1 使用 PDO(也 +1 对 PDO 评论:P)
  • @Dave 你会说我要保存在数组中的杂散数据量的限制。因为我可以选择一个月内的所有帖子,我认为这就是我要做的,但是在什么情况下,这个选项会让我失望,而不是准确地查询我每天需要什么。那么太多查询与太多杂散数据的临界点是什么?谢谢h2ooooo
  • 引爆点实际上取决于服务器/设置。当我使用足够广泛的查询将数据拉入数组并在程序内部使用它时,我倾向于获得更好的基准。根据您使用的是本地数据库服务器还是远程数据库服务器,基准测试将发生巨大变化。它还取决于您的资源瓶颈在哪里(我的服务器往往受 CPU 限制,但有足够的内存和 IO 用于本地数据操作)。请记住,每个数据库查询都会遍历您的整个数据库以搜索您的特定条件,然后将其乘以查询计数并加起来
  • 谢谢@Dave!我改变了获取数据的方式,结果很奇怪。我正在发布另一个关于它的问题,希望你能检查出来

标签: php mysql pdo


【解决方案1】:

我只想指出我确实解决了这个问题。如果有人想知道为什么 foreach 循环如此查询,那是因为我不小心删除了每次在 foreach 循环中连接到 Facebook api 以收集发布者信息的行。因此,如果有人偶然发现这个问题,只是为了确保我想澄清一下,进行许多 facebook->api 调用是一件坏事。将信息保存在您的数据库中并进行查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多