什么更快?在循环中触发查询或循环遍历数组?

时间:2013-06-19 16:00:23

标签: php mysql performance nested-loops

我只是问自己什么是更快的:我有一个for循环,我必须根据我的循环变量检查某个表列。

现在我有两个选择:在循环中我为每次迭代激活一个查询并检查我的结果。第二个选项是获取我需要的所有行,并在我的for循环中运行foreach循环并检查我的所需字段和循环变量之间是否有有效匹配。

这有点难以解释,但我只是让代码说话。我不在循环中使用真实代码,而是通过插图的虚构函数调用。

选项1:每次迭代查询数据库。

<?php

// Option 1:

for($i = 0; $i < 5; $i++)
{
    $query_result = query_database_where_field_equals($i);
    if($query_result)
    {
        echo "Here is something";
    }
    else
    {
        echo "Here is nothing";
    }

}

// Option 2:

$results = query_database_and_get_all_results();

for($i = 0; $i < 5; $i++)
{

    foreach($results AS $result)
    {
        if($result['desired_field'] == $i)
        {
            echo "Here is something";
        }
        else
        {
            echo "Here is nothing";
        }
    }

}

?>

这两种方式都可行,但我非常确定以高效的观点在循环中触发查询是一种更糟糕的做法。

但是在for循环中使用foreach循环对我来说似乎有点奇怪。

那么首选的方式是什么?

修改 - 添加信息

我有一个需要多次运行的for循环。数量是静态的(例如5),并且不依赖于数据库中的任何记录。每次迭代都代表一个位置。

我有一个数据库表,可能存储有关职位所包含的信息。

示例:

positions (id, position)

所以示例记录可能是:     职位(1,2)

这意味着我在位置2上有一些东西。我想在循环中做的基本上是,检查我是否得到了该位置的记录。预期的产出将是:

Here is nothing
Here is nothing
Here is something
Here is nothing
Here is nothing

3 个答案:

答案 0 :(得分:1)

都不是。

您应该使用WHERE field IN (0, 1, 2, 3, 4)

将循环放入查询中

答案 1 :(得分:1)

第二个选项是两个给定选项的首选,但是知道更多关于你正在循环和查询的内容的信息可能会帮助你得到更好的答案。

答案 2 :(得分:1)

以前的答案都是正确的 @Euantorano:代码迭代优于查询。您将避免速度较慢的数据库访问,并避免数据库过载 尽管如此,正如Slaks所说,你可以添加WHERE条件,这会减少你的数组。提高循环性能以检查存在。

最后我建议让一个bucle来索引结果,这样你就可以检查结果是否已设置。

$res = array();
$results = query_database_and_get_all_results();
for($results as $r) {
    $res[$result['desired_field']] = $r;
}
for($i = 0; $i < 5; $i++) {
    echo (isset($res[i]) ? "Here is something" : "Here is nothing");
}

此代码根据数组的大小+第二个bucle为您提供持续的性能。 根据您的需求,更好的查询实际上可以带来更好的性能,但这取决于您的具体问题 希望它有所帮助!