Performance 使用循环INNERJOIN从MYSQL查询中缓慢计数记录
救命啊,, 我只想从我的数据库里知道个数, 是的,我有多对多关系表 记录为100.000-150.000 所以我使用内部连接,它看起来对我来说很有效 但是 我有一个非常慢的查询,大约2-5秒Performance 使用循环INNERJOIN从MYSQL查询中缓慢计数记录,performance,count,query-optimization,inner-join,Performance,Count,Query Optimization,Inner Join,救命啊,, 我只想从我的数据库里知道个数, 是的,我有多对多关系表 记录为100.000-150.000 所以我使用内部连接,它看起来对我来说很有效 但是 我有一个非常慢的查询,大约2-5秒 SELECT COUNT(*) FROM monitoring_pasien INNER JOIN master_desa ON master_desa.DESA_ID = monitoring_pasien.DESA_ID INNER JOIN monitoring_loket ON monitorin
SELECT COUNT(*) FROM monitoring_pasien
INNER JOIN master_desa ON master_desa.DESA_ID = monitoring_pasien.DESA_ID
INNER JOIN monitoring_loket ON monitoring_pasien.PASIEN_ID = monitoring_loket.PASIEN_ID AND monitoring_pasien.PKM_ID = monitoring_loket.PKM_ID
INNER JOIN monitoring_pelayanan ON monitoring_pelayanan.LOKET_ID = monitoring_loket.LOKET_ID AND monitoring_pelayanan.PKM_ID = monitoring_loket.PKM_ID
INNER JOIN monitoring_diagnosa ON monitoring_diagnosa.PELAYANAN_ID = monitoring_pelayanan.PELAYANAN_ID AND monitoring_diagnosa.PKM_ID = monitoring_pelayanan.PKM_ID
INNER JOIN master_penyakit ON master_penyakit.PENYAKIT_ID = monitoring_diagnosa.PENYAKIT_ID
WHERE monitoring_pasien.DESA_ID < 19 AND master_desa.DESA_ID <> 0 AND master_penyakit.SURVEYLANS = '1';
然后。。。
当我将其用于此查询时,它将工作约100秒:
$query = "SELECT * FROM master_desa WHERE DESA_ID < 19 AND DESA_ID <> 0 ORDER BY DESA asc";
$result = mysql_query($query) or die('Error');
while($data = mysql_fetch_array($result))
{
$DESA = $data["DESA"];
$DESA_ID = $data["DESA_ID"];
$queryPasien = "SELECT COUNT(*) AS jumPasien FROM monitoring_pasien
INNER JOIN master_desa ON master_desa.DESA_ID = monitoring_pasien.DESA_ID
INNER JOIN monitoring_loket ON monitoring_pasien.PASIEN_ID = monitoring_loket.PASIEN_ID AND monitoring_pasien.PKM_ID = monitoring_loket.PKM_ID
INNER JOIN monitoring_pelayanan ON monitoring_pelayanan.LOKET_ID = monitoring_loket.LOKET_ID AND monitoring_pelayanan.PKM_ID = monitoring_loket.PKM_ID
INNER JOIN monitoring_diagnosa ON monitoring_diagnosa.PELAYANAN_ID = monitoring_pelayanan.PELAYANAN_ID AND monitoring_diagnosa.PKM_ID = monitoring_pelayanan.PKM_ID
INNER JOIN master_penyakit ON master_penyakit.PENYAKIT_ID = monitoring_diagnosa.PENYAKIT_ID
WHERE master_desa.DESA='$DESA' AND master_penyakit.PENYAKIT_ID = '$penyakit' AND TGL LIKE '$pilihan' ";
$resultPasien = mysql_query($queryPasien) or die('Error');
while($dataPasien = mysql_fetch_array($resultPasien))
{
$jumPasien = $dataPasien['jumPasien'];
if ($jumData == 0) { $persen = "0%"; }
else {
$bagi = $jumPasien/$jumData;
$persen = round((float)$bagi * 100 ) . '%';
}
echo "<tr>
<td>$DESA</td>
<td width=\"40\"> : $persen</td>
<td width=\"70\">";
$loop = floor($persen/2);
$gambar = "images/bar.png";
for($j=0;$j<=$loop;$j++)
{
echo "<img src=\"$gambar\" alt=\"=\" />";
}
echo "</td></tr>";
}
if ($persen >= 0 AND $persen <= 25) { $color = "green"; }
else if ($persen > 25 AND $persen <= 50) { $color = "blue"; }
else if ($persen > 50 AND $persen <= 75) { $color = "yellow"; }
else if ($persen > 75 AND $persen <= 100) { $color = "red"; }
if ($DESA == 'GEDONGAN') { $gedongan_jml=" $jumPasien Penderita [ $persen ]"; $gedongan_color=$color;}
else if ($DESA == 'BALONGSARI') { $balongsari_jml=" $jumPasien Penderita [ $persen ]"; $balongsari_color=$color;}
else if ($DESA == 'BLOOTO') { $blooto_jml=" $jumPasien Penderita [ $persen ]"; $blooto_color=$color;}
}
我的代码怎么了
感谢您的帮助如果您没有理由进行内部连接,请使用左连接代替:
SELECT COUNT(*) FROM monitoring_pasien
LEFT JOIN master_desa ON master_desa.DESA_ID = monitoring_pasien.DESA_ID
LEFT JOIN monitoring_loket ON monitoring_pasien.PASIEN_ID = monitoring_loket.PASIEN_ID AND monitoring_pasien.PKM_ID = monitoring_loket.PKM_ID
LEFT JOIN monitoring_pelayanan ON monitoring_pelayanan.LOKET_ID = monitoring_loket.LOKET_ID AND monitoring_pelayanan.PKM_ID = monitoring_loket.PKM_ID
LEFT JOIN monitoring_diagnosa ON monitoring_diagnosa.PELAYANAN_ID = monitoring_pelayanan.PELAYANAN_ID AND monitoring_diagnosa.PKM_ID = monitoring_pelayanan.PKM_ID
LEFT JOIN master_penyakit ON master_penyakit.PENYAKIT_ID = monitoring_diagnosa.PENYAKIT_ID
WHERE monitoring_pasien.DESA_ID < 19 AND master_desa.DESA_ID <> 0 AND master_penyakit.SURVEYLANS = '1';
如果不知道每个表中有多少行,谈论速度是没有建设性的。但是你在WHERE子句中使用了LIKE-afaik,这非常慢。是的,你是对的,我在其中使用LIKE和using=使速度加快了200%,但仍然很慢,现在是50-70秒,但是,谢谢,这非常有帮助,你确定吗?因为在我的例子中,内部联接的工作速度比navicatit测试的左联接快,这取决于您想要计数的内容以及每个表中有多少个条目