在fooreach循环中连接MySQL会降低我的php页面速度

在fooreach循环中连接MySQL会降低我的php页面速度,php,mysql,slowdown,Php,Mysql,Slowdown,我有php+mysql中的约会脚本 在脚本中,我有6列,每列有64行,等于384字段。 对于每个字段,我都有一个mysql\u查询连接,这使得到mysql的连接达到384个。 有没有办法让这个脚本更有效更快??? 我还想补充一点,这个脚本运行在Xeon 3.4ghz 4核8gb ram服务器上,我对这个页面的延迟大约为20-25秒。但在另一个我不使用循环的页面上,即使我列出几百行,我也会有非常快的结果 这是我的代码: $listebolum=mysql_query("SELECT * FROM

我有php+mysql中的约会脚本

在脚本中,我有6列,每列有64行,等于384字段。 对于每个字段,我都有一个mysql\u查询连接,这使得到mysql的连接达到384个。 有没有办法让这个脚本更有效更快??? 我还想补充一点,这个脚本运行在Xeon 3.4ghz 4核8gb ram服务器上,我对这个页面的延迟大约为20-25秒。但在另一个我不使用循环的页面上,即使我列出几百行,我也会有非常快的结果

这是我的代码:

$listebolum=mysql_query("SELECT * FROM bolum WHERE randevu='ok' AND sube='".$_SESSION[ksube]."' ORDER BY id ASC");
while($listeboluml=mysql_fetch_array($listebolum)) {
    $basla=$danas;
    echo "<div style=\"position:relative; width:".$sirina."%; float:left; border-right:solid 1px #9a4b9d;\">";
    for($ra=$danas; $ra<$danasson; $ra=($ra+900)) {

        $uzmirandevu=mysql_query("SELECT randevu.id AS rid, randevu.bitis AS rbitis, randevu.baslama AS rbaslama, randevu.notum AS rnotum, randevu.hizmetler AS rhizmetler, musteri.ad AS mad, musteri.soyad AS msoyad FROM randevu LEFT JOIN musteri ON randevu.musteri=musteri.id WHERE randevu.baslama='".$basla."' AND randevu.sube='".$_SESSION[ksube]."' AND randevu.bolum='".$listeboluml[id]."'");
        $uzmirandevul=mysql_fetch_array($uzmirandevu);
        $yukseklik=(((($uzmirandevul[rbitis]-$uzmirandevul[rbaslama])/900)*26)-1);
        echo "some data from databse"; 
        $basla=$uzmirandevul[rbitis];
    }
}
echo "</div>";
}

因为你的代码不是用英语写的,所以对我来说有点难理解,但是我建议你读一读关于这个代码的内容。您可能可以从循环中删除第二个查询,以减少SQL查询。这就是所谓的急加载

以下是一个例子:

SELECT * FROM authors // first query

foreach ($authors as $author) {
    SELECT * FROM books WHERE author_id = $author->id // second query
}
有10位作者,这一切都很顺利。但是,对于100位作者,您将运行101个查询:1个用于获取作者列表,然后每个作者1个。换句话说,更多的作者意味着更多的查询,因此加载时间更长

通过从foreach循环中删除第二个查询,可以加快速度:

SELECT * FROM authors // first query

$author_ids = array();
foreach ($authors as $author) {
    $author_ids[] = $author->id; // add author id to array
}

$author_ids = implode(',', $author_ids); // create a list of comma-seperated ids

SELECT * FROM books WHERE author_id IN ($author_ids) // second query

foreach ($authors as $author) {
    // link books to authors
}
通过这种方式,您可以使用一个查询来检索所有书籍,然后使用PHP将书籍链接到正确的作者


这有点复杂,但它将SQL查询的数量减少到了2个。这显然仍然是非常简单的,但它应该让您了解这个概念。

您能告诉我们您的数据库结构是什么样子吗?@sulmanpucit当然
$yukseklik=($uzmirandevul['rbitis']-$uzmirandevul['rbaslama'])/900*26-1根据循环的结果数量,您可能会运行许多其他查询。您不能使用
JOIN
来提取额外的数据吗?您不应该使用mysql\u fetch\u数组和mysql\u query,因为它们已被弃用。您应该使用MySQLi或PDO。请看这里:谢谢,我会看一下,这就是我想要的:从foreach中删除查询,这样我就可以拥有更快的脚本。但正如我说的,我不知道怎么做。现在我正在研究N+1问题:)我添加了一个示例。它还没有准备好使用,但它应该能让你了解这个概念。顺便说一句,这个解决方案被称为“急切加载”。对于更多的读者来说,这是一个关于什么是“急切加载”的有用链接:你将如何将这个答案应用到他的案例中?正如他在回复我的评论时所解释的,内部查询的每个迭代都依赖于前一个查询返回的值。他不仅仅是为第一个查询返回的每个值获取一行。
SELECT * FROM authors // first query

$author_ids = array();
foreach ($authors as $author) {
    $author_ids[] = $author->id; // add author id to array
}

$author_ids = implode(',', $author_ids); // create a list of comma-seperated ids

SELECT * FROM books WHERE author_id IN ($author_ids) // second query

foreach ($authors as $author) {
    // link books to authors
}