1

我在 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 ;
4

1 回答 1

3

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

于 2013-12-09T15:50:24.913 回答