MySQL-Abfrage optimieren

devilzride

Grünschnabel
Hallöchen alle miteinander.
Hab ein kleines Problem. Und zwar geht es um eine größere MySQL-Abfrage in der diverse Sachen wie eine Umkreissuche, Alter von/bis, Geschlecht, etc abgefragt werden. Funktioniert auch alles wunderbar, das Problem ist, das bei 150 angemeldeten Usern die Abfrage schon recht lang braucht (3-4 Sekunden) und ich wollte mich um eine effizientere Lösung umhören.

Hier der Ausschnitt des Codes:
PHP:
      $cnt = qry("SELECT * FROM `geodb_locations` AS s1,`user` AS s2
                  WHERE ".$radius."*SQRT(2*(1-cos(RADIANS(s1.breite))*cos(".$breite.")*(sin(RADIANS(s1.laenge))*sin(".$laenge.")+cos(RADIANS(s1.laenge))*cos(".$laenge."))-sin(RADIANS(s1.breite))*
sin(".$breite."))) <= ".$umkreis."
                  AND (TO_DAYS(NOW())-TO_DAYS(s2.bday))/365 >= '".$age_von."'
                  AND (TO_DAYS(NOW())-TO_DAYS(s2.bday))/365 <= '".$age_bis."'
                  AND s2.id != '".$_SESSION['uid']."'
                  AND INSTR(s1.plz, s2.plz)
                  ".$tsex."
                  ".$isreal."
                  ".$single."
                  ".$tfor."
                  AND s2.aktiv = 1");


      $qry = qry("SELECT s2.id,s2.user,s1.ort, s2.plz, ".$radius."*SQRT(2*(1-cos(RADIANS(s1.breite))*cos(".$breite.")*(sin(RADIANS(s1.laenge))*sin(".$laenge.")+cos(RADIANS(s1.laenge))*cos(".$laenge."))- sin(RADIANS(s1.breite))*sin(".$breite."))) AS Distance FROM `geodb_locations` AS s1,`user` AS s2
                  WHERE ".$radius."*SQRT(2*(1-cos(RADIANS(s1.breite))*cos(".$breite.")*(sin(RADIANS(s1.laenge))*sin(".$laenge.")+cos(RADIANS(s1.laenge))*cos(".$laenge."))-sin(RADIANS(s1.breite))*
sin(".$breite."))) <= ".$umkreis."
                  AND (TO_DAYS(NOW())-TO_DAYS(s2.bday))/365 >= '".$age_von."'
                  AND (TO_DAYS(NOW())-TO_DAYS(s2.bday))/365 <= '".$age_bis."'
                  AND s2.id != '".$_SESSION['uid']."'
                  AND INSTR(s1.plz, s2.plz)
                  ".$tsex."
                  ".$isreal."
                  ".$single."
                  ".$tfor."
                  AND s2.aktiv = 1
                  ORDER BY ".$order."
                  LIMIT ".($page - 1)*$sites.",".$sites."");
}
    $res = mysql_num_rows($cnt);
Die erste Abfrage ist für die Gesamtzahl der Treffer (damit das ganze in einzelne Seiten unterteilt werden kann).

Ich hoffe ihr habt ein paar Tips für mich :)

Gruß,

Frank
 
Um allein die Anzahl der ausgewählten Datensätze einer Abfrage zu ermitteln, solltest du lieber die COUNT()-Funktion nutzen anstatt die Datensätze tatsächlich auszuwähen:
Code:
SELECT
        COUNT(*) AS `anzahl`
  FROM
        …
 
Zurück