In mijn database bevat op het moment 20 kolommen en ca 80.000 regels. Met behulp van de volgende formule

<?php
$MeanTemp = mysql_query("SELECT AVG(Tempout) AS GemTemp FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "'");
if ($MeanTemp) {
$MeanTemp_result = mysql_fetch_array($MeanTemp);
$MeanTemp_result = number_format($MeanTemp_result['GemTemp'],1,'.','');
echo "<td>" . $MeanTemp_result . "</td>";
}else{
echo "$error";
}
?>


voer ik een qeury uit om van een bepaalde kolom en een bepaald aantal regels een gemiddelde te bepalen. Dit doe ik op één pagina met ca 10 vergelijkbare formules voor diverse kolommen. Nu is de pagina relatief traag bij het laden. Kan ik iets in de code veranderen (of een andere manier) om de laadtijd van de pagina te verkorten?
als die kolommen allemaal in een tabel staan moet het ook met één query kunnen. Verder mysql_fetch_assoc ipv mysql_fetch_array en zorgen voor de juiste datatypes in je database
zijn de indexen goed?
Ik zou zeggen een index op Temout en weerdata in dit geval.

Geef je andere sqlletjes een kijken we of het een beetje sneller kan
De code heb ik in een apart bestand staan als 2 functies welke ik op mijn pagina oproep. Dit zijn de 2 de functies:

<?php
$error = "Fout in query! <b>" . mysql_errno($db) . "</b> " . mysql_error($db) . "<br>\n";

function display_table_day($date)
{
$MeanTemp = mysql_query("SELECT AVG(Tempout) AS GemTemp FROM weerdata WHERE Date='" . $date . "'");
if ($MeanTemp) {
while ($MeanTemp_result = mysql_fetch_array($MeanTemp)){
$MeanTemp_result = number_format($MeanTemp_result['GemTemp'],1,'.','');
echo "<td>" . $MeanTemp_result . "</td>";
}
}else{
echo "$error";
}
$HiTemp = mysql_query("SELECT *, DATE_FORMAT(Time, '%H:%i') AS shorttime FROM weerdata WHERE Date='$date' ORDER BY HiTemp DESC, Time ASC LIMIT 1");
if ($HiTemp) {
while ($HiTemp_result = mysql_fetch_array($HiTemp)){
echo "<td>". $HiTemp_result['HiTemp'] . "</td><td>" . $HiTemp_result['shorttime'] . "</td>";
}
}else{
echo "$error";
}
$LowTemp = mysql_query("SELECT *, DATE_FORMAT(Time, '%H:%i') AS shorttime FROM weerdata WHERE Date='$date' ORDER BY LowTemp, Time ASC LIMIT 1");
if ($LowTemp) {
while ($LowTemp_result = mysql_fetch_array($LowTemp)){
echo "<td>" . $LowTemp_result['LowTemp'] . "</td><td>" . $LowTemp_result['shorttime'] . $Time . "</td>";
}
}else{
echo "$error";
}
$WindChill = mysql_query("SELECT *, DATE_FORMAT(Time, '%H:%i') AS shorttime FROM weerdata WHERE Date='$date' ORDER BY WindChill, Time ASC LIMIT 1");
if ($WindChill) {
while ($WindChill_result = mysql_fetch_array($WindChill)){
echo "<td>" . $WindChill_result['WindChill'] . "</td><td>" . $WindChill_result['shorttime'] . "</td>";

}
}else{
echo "$error";
}
$HiBar = mysql_query("SELECT * FROM weerdata WHERE Date='$date' ORDER BY Bar DESC LIMIT 1");
if ($HiBar) {
while ($HiBar_result = mysql_fetch_array($HiBar)){
echo "<td>". $HiBar_result['Bar'] . "</td>";
}
}else{
echo "$error";
}

$LowBar = mysql_query("SELECT * FROM weerdata WHERE Date='$date' ORDER BY Bar ASC LIMIT 1");
if ($LowBar) {
while ($LowBar_result = mysql_fetch_array($LowBar)){
echo "<td>". $LowBar_result['Bar'] . "</td>";
}
}else{
echo "$error";
}
$HiWind = mysql_query("SELECT *, DATE_FORMAT(Time, '%H:%i') AS shorttime FROM weerdata WHERE Date='$date' ORDER BY WindSpeed DESC, Time ASC LIMIT 1");
if ($HiWind) {
while ($HiWind_result = mysql_fetch_array($HiWind)){
$windeng = array( "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW" );
$windned = array( "N", "NNO", "NO", "ONO", "O", "OZO", "ZO", "ZZO", "Z", "ZZW", "ZW", "WZW", "W", "WNW", "NW", "NNW" );
$WindDir = str_replace($windeng, $windned, $HiWind_result['WindDir']);
echo "<td>". $HiWind_result['WindSpeed'] . "</td><td>" . $HiWind_result['shorttime'] . "</td><td>" . $WindDir . "</td>";
}
}else{
echo "$error";
}

$Rain = mysql_query("SELECT SUM(Rain) FROM weerdata WHERE Date='$date'");
if ($Rain) {
while ($Rain_result = mysql_fetch_array($Rain)){
echo "<td>" . $Rain_result[0] . "</td>";
}
}else{
echo "$error";
}

$RainRate = mysql_query("SELECT *, DATE_FORMAT(Time, '%H:%i') AS shorttime FROM weerdata WHERE Date='$date' ORDER BY RainRate DESC, Time ASC LIMIT 1");
if ($RainRate) {
while ($RainRate_result = mysql_fetch_array($RainRate)){
echo "<td>". $RainRate_result['RainRate'] . "</td><td>" . $RainRate_result['shorttime'] . "</td>";
}
}else{
echo "$error";
}

$HiHum = mysql_query("SELECT * FROM weerdata WHERE Date='$date' ORDER BY OutHum DESC LIMIT 1");
if ($HiHum) {
while ($HiHum_result = mysql_fetch_array($HiHum)){
echo "<td>". $HiHum_result['OutHum'] . "</td>";
}
}else{
echo "$error";
}

$LowHum = mysql_query("SELECT * FROM weerdata WHERE Date='$date' ORDER BY OutHum ASC LIMIT 1");
if ($LowHum) {
while ($LowHum_result = mysql_fetch_array($LowHum)){
echo "<td>" . $LowHum_result['OutHum'] . "</td></tr>\n";
}
}else{
echo "$error";
}
}
//*******************************************************************************************************************************
function display_table_totalday($first_date, $second_date)
{
$MeanTemp = mysql_query("SELECT AVG(Tempout) AS GemTemp FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "'");
if ($MeanTemp) {
$MeanTemp_result = mysql_fetch_array($MeanTemp);
$MeanTemp_result = number_format($MeanTemp_result['GemTemp'],1,'.','');
echo "<td>" . $MeanTemp_result . "</td>";
}else{
echo "$error";
}
$HiTemp = mysql_query("SELECT HiTemp FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY HiTemp DESC LIMIT 1");
if ($HiTemp) {
$HiTemp_result = mysql_fetch_array($HiTemp);
echo "<td>". $HiTemp_result['HiTemp'] . "</td><td>&nbsp;</td>";
}else{
echo "$error";
}
$LowTemp = mysql_query("SELECT LowTemp FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY LowTemp ASC LIMIT 1");
if ($LowTemp) {
$LowTemp_result = mysql_fetch_array($LowTemp);
echo "<td>" . $LowTemp_result['LowTemp'] . "</td><td>&nbsp;</td>";
}else{
echo "$error";
}
$WindChill = mysql_query("SELECT WindChill FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY WindChill ASC LIMIT 1");
if ($WindChill) {
$WindChill_result = mysql_fetch_array($WindChill);
echo "<td>" . $WindChill_result['WindChill'] . "</td><td>&nbsp;</td>";
}else{
echo "$error";
}
$HiBar = mysql_query("SELECT Bar FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY Bar DESC LIMIT 1");
if ($HiBar) {
$HiBar_result = mysql_fetch_array($HiBar);
echo "<td>". $HiBar_result['Bar'] . "</td>";
}else{
echo "$error";
}

$LowBar = mysql_query("SELECT Bar FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY Bar ASC LIMIT 1");
if ($LowBar) {
$LowBar_result = mysql_fetch_array($LowBar);
echo "<td>". $LowBar_result['Bar'] . "</td>";
}else{
echo "$error";
}
$HiWind = mysql_query("SELECT WindSpeed FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY WindSpeed DESC LIMIT 1");
if ($HiWind) {
$HiWind_result = mysql_fetch_array($HiWind);
$windeng = array( "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW" );
$windned = array( "N", "NNO", "NO", "ONO", "O", "OZO", "ZO", "ZZO", "Z", "ZZW", "ZW", "WZW", "W", "WNW", "NW", "NNW" );
$WindDir = str_replace($windeng, $windned, $HiWind_result['WindDir']);
echo "<td>". $HiWind_result['WindSpeed'] . "</td><td>&nbsp;</td><td>" . $WindDir . "</td>";
}else{
echo "$error";
}
$Rain = mysql_query("SELECT SUM(Rain) FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "'");
if ($Rain) {
while ($Rain_result = mysql_fetch_array($Rain)){
echo "<td>" . $Rain_result[0] . "</td>";
}
}else{
echo "$error";
}
$RainRate = mysql_query("SELECT RainRate FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY RainRate DESC LIMIT 1");
if ($RainRate) {
while ($RainRate_result = mysql_fetch_array($RainRate)){
echo "<td>". $RainRate_result['RainRate'] . "</td><td>&nbsp;</td>";
}
}else{
echo "$error";
}
$HiHum = mysql_query("SELECT OutHum FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY OutHum DESC LIMIT 1");
if ($HiHum) {
while ($HiHum_result = mysql_fetch_array($HiHum)){
echo "<td>". $HiHum_result['OutHum'] . "</td>";
}
}else{
echo "$error";
}
$LowHum = mysql_query("SELECT OutHum FROM weerdata WHERE Date BETWEEN '" . $first_date . "' AND '". $second_date . "' ORDER BY OutHum ASC LIMIT 1");
if ($LowHum) {
while ($LowHum_result = mysql_fetch_array($LowHum)){
echo "<td>" . $LowHum_result['OutHum'] . "</td></tr>\n";
}
}else{
echo "$error";
}
}
?>

De eerste functie (1e deel tot de ****-lijn) wordt dmv een lus herhaalt zodat een html-tabel met 18 kolommen en maximaal 31 regels ontstaat. De 2e functie geeft nog een regel met een totaal per kolom van de 31 regels in de html-tabel. Ik hoop dat e.e.a. niet te groot is...

Is hier een betere oplossing voor?
Gebruik geen * en vraag alles met dezelfde WHERE clause in een QUERY. en kijk eens naar de indexen van je tabel.
Heb je uberhaupt indexen op je tabel?
In plaats van * de betreffende kolomnaam? (zoals ik al wel in de 2e functie heb gedaan?)

Zou je een voorbeeld kunnen geven waarbij 2 of 3 van bovenstaande query's zijn samengevoegd met dezelfde WHERE?

Klaasjan Boven schreef op 24.04.2007 19:50
Gebruik geen * en vraag alles met dezelfde WHERE clause in een QUERY. en kijk eens naar de indexen van je tabel.
Heb je uberhaupt indexen op je tabel?

Waarom geen * gebruiken in WHERE clause?
Ik gebruik dit wel vaak namelijk.
Wat kun je daar in de plaats voor doen dan?
Alleen de kolommen pakken die je nodig hebt.

Scheelt aanzienlijk..
Verdiep jezelf even een beetje in indexen, das heeeel belangrijk.

MySQL ziet alle kolommen in een tabel apart, hierdoor scheelt het enorm als je inplaats van * de kolommen selecteert die je wil hebben. Al zijn het op 1 na alle kolommen, nog gaat je query sneller.

edit:

Getsiederie:
<?php
echo "$error";
?>

Zo kan het ook:
<?php
echo $error;
?>

Reageren