我在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 ;
答案 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.这显然仍然非常简单,但它应该让您了解这个概念。