Ankündigung

Einklappen
Keine Ankündigung bisher.

Umkreissuche Skript ist ziemlich langsam

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Umkreissuche Skript ist ziemlich langsam

    Hallo,
    ich habe eine Datenbank von opengeodb und möchte dazu eine passende Umkreissuche erstellen welche soweit auch funktioniert nur extrem Serverlastig ist. Das Skript sieht so aus:
    PHP-Code:
    $radius 6368;
    $plz '10115';
    $umkreis 20;


    $sql 'SELECT
                coo.lon,
                coo.lat
            FROM geodb_coordinates AS coo
            INNER JOIN geodb_textdata AS textdata
            ON textdata.loc_id = coo.loc_id
            WHERE
                textdata.text_val = "' 
    mysql_real_escape_string($plz) . '"
            AND textdata.text_type = "500300000"
            '
    ;
    $re mysql_query($sql,$dbverbindung2);
    if (
    mysql_num_rows($re) != 1) {
        die(
    $plz ' wurde nicht gefunden.');
    }
    list(
    $lon$lat) = mysql_fetch_row($re);

    $rad_l $lat 180 M_PI;
    $rad_b $lon 180 M_PI;


    ###habe ich eingebaut damit er nicht überall suchen muss###
    $latp=$lat+5;
    $latm=$lat-5;
    $lonp=$lon+5;
    $lonm=$lon-5;
    ##########

    $query "SELECT loc_id, (
     "
    .$radius." * SQRT(2*(1-cos(RADIANS(lon)) * 
     cos("
    .$rad_b.") * (sin(RADIANS(lat)) *
     sin("
    .$rad_l.") + cos(RADIANS(lat)) * 
     cos("
    .$rad_l.")) - sin(RADIANS(lon)) * sin(".$rad_b.")))) AS Distance 
     FROM geodb_coordinates
    WHERE lat>='
    $latm' and lat<='$latp'and  lon>='$lonm' and lon<='$lonp'
     Having Distance <= "
    .$umkreis.
     ORDER BY Distance

    "
    ;

    $sql mysql_query($query,$dbverbindung2)or die(mysql_error()); 
    while( 
    $erg mysql_fetch_object($sql) ) {

        echo 
    $erg->loc_id."<br>";

    Was muss ich anderes machen damit der Server nicht so viel beansprucht wird?

  • #2
    Ohne jetzt die genaue Datenstruktur und Menge zu kennen Schüsse ins Blaue, aber sind Indizes für die Join-Felder definiert?

    Eventuell kann man etwas vorberechnen was weniger Daten liefert aber trotzdem noch eine hinreichende Genauigkeit ergibt?

    Gruß
    D.

    Kommentar


    • #3
      Zitat von themonk Beitrag anzeigen
      PHP-Code:
      $query "SELECT loc_id, (
       "
      .$radius." * SQRT(2*(1-cos(RADIANS(lon)) * 
       cos("
      .$rad_b.") * (sin(RADIANS(lat)) *
       sin("
      .$rad_l.") + cos(RADIANS(lat)) * 
       cos("
      .$rad_l.")) - sin(RADIANS(lon)) * sin(".$rad_b.")))) AS Distance 
       FROM geodb_coordinates
      WHERE lat>='
      $latm' and lat<='$latp'and  lon>='$lonm' and lon<='$lonp'
       Having Distance <= "
      .$umkreis.
       ORDER BY Distance

      "

      Was muss ich anderes machen damit der Server nicht so viel beansprucht wird?
      Diese SQL Anweisung ist suboptimal, die Berechnung wird für jeden Datensatz erneut durchgeführt und bremst natürlich.

      Stattdessen könntest du vom Mittelpunkt der Suche ausgehend zwei Punkte berechnen, links oben und rechts unten, danach dann alles innerhalb dieses Vierecks suchen - es ist nicht 100% exakt, aber wesentlich schneller als die dauernde Neuberechnung.
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Zitat von lstegelitz Beitrag anzeigen
        Stattdessen könntest du vom Mittelpunkt der Suche ausgehend zwei Punkte berechnen, links oben und rechts unten, danach dann alles innerhalb dieses Vierecks suchen - es ist nicht 100% exakt, aber wesentlich schneller als die dauernde Neuberechnung.
        Exakt und schnell wird es wenn man diese beiden Ansätze kombiniert, wenn man also zuerst maximale und minimale Breiten- und Längengrade berechnet und dann die genaue Entfernungsberechnung auf das so enthaltene Quadrat einschränkt.

        Oops, wie ich sehe wird das ja schon gemacht. Sind denn Indizes auf den Koordinaten?
        Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

        Kommentar

        Lädt...
        X