在foreach循环中连接到MySQL会减慢我的php页面

时间:2013-12-09 15:32:44

标签: php mysql slowdown

我在php + mysql中预约了脚本。

脚本中的

我有6列,每列有64行,等于384字段。 对于每个字段,我都有一个mysql_query连接,它与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>";
}

MySQL结构:

`randevu` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`baslama` int(10) unsigned NOT NULL,
`bitis` int(10) unsigned NOT NULL,
`musteri` int(10) unsigned NOT NULL,
`personel` smallint(5) unsigned NOT NULL,
`notum` varchar(512) COLLATE utf8_unicode_ci NOT NULL,
`durum` char(2) COLLATE utf8_unicode_ci NOT NULL,
`sube` smallint(4) unsigned NOT NULL,
`bolum` smallint(4) unsigned NOT NULL,
`hizmetler` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
`zaman` int(10) unsigned NOT NULL,
`rgun` tinyint(2) NOT NULL,
`ray` tinyint(2) NOT NULL,
`ryil` smallint(4) NOT NULL,
`guncelleme` int(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

1 个答案:

答案 0 :(得分:3)

因为你的代码不是用英文写的,所以我很难理解它,但我建议你先阅读一下N+1 problem。您可以从循环中删除第二个查询以减少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.这显然仍然非常简单,但它应该让您了解这个概念。