Tach,
ich habe eine Umkreissuche Programmiert mit Daten von obengeodb.
Da ich wissen wollte wie sich meine Seite bei ein paar Datensätzen in der Db macht habe ich mir mal ein paar angelegt.
Leider musste ich feststellen, das sehr schnell schluss ist.
Ab 5000 Datensätzen wird es erheblich langsam und führt nicht nur selten zu einem Timeout,.
Folgende Abfragen lasse ich auf die DB los.
Die Rechnung ist sicherlich sehr Zeitraubend aber doch von nöten.
Hat von euch jemand ein Tip wie ich das ganze schneller lösen könnte?
ich habe eine Umkreissuche Programmiert mit Daten von obengeodb.
Da ich wissen wollte wie sich meine Seite bei ein paar Datensätzen in der Db macht habe ich mir mal ein paar angelegt.
Leider musste ich feststellen, das sehr schnell schluss ist.
Ab 5000 Datensätzen wird es erheblich langsam und führt nicht nur selten zu einem Timeout,.
Folgende Abfragen lasse ich auf die DB los.
PHP Code:
<?php
//###########################################################
// Einfache suche
if ($_GET['action'] == 'search')
{
// Suche
if (!isset($_GET['cat']))
{
$plz = $_POST["plz"];
$umkreis = $_POST["umkreis"];
$db = new db($schema);
$laenge_breite = mysql_query("SELECT laenge, breite FROM orte WHERE plz = $plz");
$Laenge_breitearray = mysql_fetch_array($laenge_breite);
$_SESSION['plz'] = $plz;
$_SESSION['umkreis'] = $umkreis;
}
else
{
$plz = $_SESSION["plz"];
$umkreis = $_SESSION["umkreis"];
$db = new db($schema);
$laenge_breite = mysql_query("SELECT laenge, breite FROM orte WHERE plz = $plz");
$Laenge_breitearray = mysql_fetch_array($laenge_breite);
}
$laenge=$Laenge_breitearray[0] / 180 * M_PI; // Umrechnung von GRAD IN RAD
$breite=$Laenge_breitearray[1] / 180 * M_PI; // Umrechnung von GRAD IN RAD
//##################################################################
// Blätterfunktion einrichten
$db = new db($schema);
$pp = new LoadPP();
$pp->params = "page=search&action=search&";
$pp->ppage = 20;
$count = mysql_query("
SELECT
e.event_id,
(6367.41*SQRT(2*(1-cos(RADIANS(breite))
*cos(".$breite.")*(sin(RADIANS(laenge))
*sin(".$laenge.")+cos(RADIANS(laenge))
*cos(".$laenge."))-sin(RADIANS(breite))
*sin(".$breite."))))
AS Distance
FROM
orte AS o
JOIN
event AS e
ON o.plz = e.plz
WHERE
e.gespert = 0
AND
6367.41*SQRT(2*(1-cos(RADIANS(breite))
*cos(".$breite.")
*(sin(RADIANS(laenge))
*sin(".$laenge.")+cos(RADIANS(laenge))
*cos(".$laenge."))-sin(RADIANS(breite))
*sin(".$breite."))) <= ".$umkreis."
OR e.plz = '$plz'
ORDER BY Distance");
$pp->NumRow = mysql_num_rows($count);
$sites = $pp->site_divide();
//Blätterfunktion ende
// Berechnen aller PLZ die in dem angegebenen Umkreis sind
$db = new db($schema);
$events = $db->getmatrix("
SELECT
o.ort,
o.plz,
e.event_id,
e.kat_id,
e.titel,
e.fsa_datum,
e.location,
k.kategorie,
b.thumb,
(6367.41*SQRT(2*(1-cos(RADIANS(breite))
*cos(".$breite.")*(sin(RADIANS(laenge))
*sin(".$laenge.")+cos(RADIANS(laenge))
*cos(".$laenge."))-sin(RADIANS(breite))
*sin(".$breite."))))
AS Distance
FROM
orte AS o
JOIN
event AS e
ON o.plz = e.plz
JOIN
event_kat AS k
ON e.kat_id = k.kat_id
LEFT JOIN
bilder AS b
ON e.event_id = b.event_id OR b.event_id IS NULL
WHERE
e.gespert = 0
AND
6367.41*SQRT(2*(1-cos(RADIANS(breite))
*cos(".$breite.")
*(sin(RADIANS(laenge))
*sin(".$laenge.")+cos(RADIANS(laenge))
*cos(".$laenge."))-sin(RADIANS(breite))
*sin(".$breite."))) <= ".$umkreis."
OR e.plz = '$plz'
ORDER BY Distance DESC LIMIT $start,".$pp->ppage."");
// Ausgabe des ergebnisses
require_once($tmppfad.'show_ergebniss.php');
// Wenn kein ergebniss mach irgendwas
}
Die Rechnung ist sicherlich sehr Zeitraubend aber doch von nöten.
Hat von euch jemand ein Tip wie ich das ganze schneller lösen könnte?
Comment