2013-12-19 42 views
0

幫助, 我只是想從我的數據庫稱爲COUNT(*), 耶士我有多對多關係表 100.000 - 150.000記錄 所以我用INNER JOIN,它看起來像幹活的我..慢計數記錄與循環INNERJOIN

但....

我有一個很慢這樣的查詢,它的工作約2-5second

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';  

然後...... 當我與此查詢使用它,它就會入鍋約百秒:(

$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;}     

}

什麼錯我的代碼?

感謝的對你有所幫助

+1

談到速度不是建設性的不知道有多少行是在每一個表所示。不過你在'WHERE'子句中使用'LIKE' - afaik這非常慢。 – niyou

+0

是的,你是正確的,我 下降LIKE和WHERE 使用該=的做出更快200% 但仍然緩慢,這是50-70second現在 但是,這樣的感謝,這是非常幫助我 –

回答

0

如果在代替沒有理由INNER JOIN使用LEFT JOIN

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'; 
+0

肯定?因爲在我的情況下,INNER JOIN工作速度比LEFT JOIN快(由navicat測試) –

+0

這取決於你想要計數的數量和每個表中有多少條目 – niyou