MySql - Suche Optimieren !

tripophon

Grünschnabel
Folgende SQL Anweisung:

$sql = "
SELECT DISTINCT pa_firmeninfo.FirmenInfoID, Firmenname, Branche, PLZ, Ort
FROM pa_firmeninfo,pa_beruf,pa_berufzufirma,pa_branche,pa_userlogin
WHERE
";
foreach($einzelwoerter as $key => $value)
{
if ($key)
$sql .= " OR ";
$sql .= "pa_berufzufirma.FirmenInfoID = pa_firmeninfo.FirmenInfoID
AND pa_beruf.BerufID = pa_berufzufirma.BerufID
AND pa_beruf.GehoertZuBranche = pa_branche.BrancheID
AND pa_firmeninfo.GehoertZuBranche = pa_branche.BrancheID
AND pa_beruf.Berufname LIKE '%$value%'";
}

Weiss jemand wie man eine solche Anweisung optimieren kann. Im Original, hängen an der Anweisung noch 5 andere ForEach-Schleifen. Das Script ist ewig Langsam. Ich würd es gerne schneller haben. :)
 
die 5 for each würde ich gerne sehen :-)

ansonsten solltest du ein cross join vermeiden.

Lieber die Tabellen mit left join verbinden.
 
Kannst du meinetwegen sehen :)

$sql = "
SELECT DISTINCT pa_firmeninfo.FirmenInfoID, Firmenname, Branche, PLZ, Ort
FROM pa_firmeninfo,pa_beruf,pa_berufzufirma,pa_branche,pa_userlogin
WHERE
";
foreach($einzelwoerter as $key => $value)
{
if ($key)
$sql .= " OR ";
$sql .= "pa_berufzufirma.FirmenInfoID = pa_firmeninfo.FirmenInfoID
AND pa_beruf.BerufID = pa_berufzufirma.BerufID
AND pa_beruf.GehoertZuBranche = pa_branche.BrancheID
AND pa_firmeninfo.GehoertZuBranche = pa_branche.BrancheID
AND pa_beruf.Berufname LIKE '%$value%'";
}

$sql .=" OR ";
foreach($einzelwoerter as $key => $value)
{
if ($key)
$sql .= " OR ";
$sql .= "pa_firmeninfo.GehoertZuBranche = pa_branche.BrancheID
AND pa_beruf.GehoertZuBranche = pa_branche.BrancheID
AND pa_berufzufirma.BerufID = pa_beruf.BerufID
AND pa_branche.Branche LIKE '%$value%'";
}

$sql .=" OR ";
foreach($einzelwoerter as $key => $value)
{
if ($key)
$sql .= " OR ";
$sql .= "pa_firmeninfo.GehoertZuBranche = pa_branche.BrancheID
AND pa_firmeninfo.Firmenname LIKE '%$value%'";
}

$sql .=" OR ";
foreach($einzelwoerter as $key => $value)
{
if ($key)
$sql .= " OR ";
$sql .= "pa_firmeninfo.GehoertZuBranche = pa_branche.BrancheID
AND pa_beruf.GehoertZuBranche = pa_branche.BrancheID
AND pa_firmeninfo.Ort LIKE '%$value%'";
}

$sql .=" OR ";
foreach($einzelwoerter as $key => $value)
{
if ($key)
$sql .= " OR ";
$sql .= "pa_firmeninfo.GehoertZuBranche = pa_branche.BrancheID
AND pa_firmeninfo.PLZ LIKE '%$value%'";
}

$sql .=" OR ";
foreach($einzelwoerter as $key => $value)
{
if ($key)
$sql .= " OR ";
$sql .= "pa_firmeninfo.GehoertZuBranche = pa_branche.BrancheID
AND pa_beruf.GehoertZuBranche = pa_branche.BrancheID
AND pa_firmeninfo.Beschreibung LIKE '%$value%'";
}

Das wäre die vollständige Abfrage. Ich weiss ja, dass das super langsam ist.
 
Fangen wir mal einfach an:

alle where Abfrageb die sich nie ändern aus den for each Schleifen raus
die braucht man eh nicht doppelt und dreifach:


$sql = "
SELECT DISTINCT pa_firmeninfo.FirmenInfoID, Firmenname, Branche, PLZ, Ort
FROM pa_firmeninfo,pa_beruf,pa_berufzufirma,pa_branche,pa_userlogin
WHERE
pa_berufzufirma.FirmenInfoID = pa_firmeninfo.FirmenInfoID
AND pa_beruf.BerufID = pa_berufzufirma.BerufID
AND pa_beruf.GehoertZuBranche = pa_branche.BrancheID
AND pa_firmeninfo.GehoertZuBranche = pa_branche.BrancheID";

dann deine for each schleifen gekürzte Version:
foreach($einzelwoerter as $key => $value)
{
if ($key)
$sql .= " or pa_beruf.Berufname LIKE '%$value%'";
}

--------------------
 
Zuletzt bearbeitet:
Hallo melmager,
das ist schon mal eine sehr gute Idea, welche ich wohl auch erst einmal versuche zu implementieren. Ich habe mir auch schon einige Artikel über Joins usw durchgelesen, aber so die richtige Peilung habe ich noch nicht. Auf jeden Fall habe ich verstanden, dass gewöhnliche 'Select where' Anweisung zuviel Rechenzeit bzw. Maschinenzyklen benötigen. Aber bei Joins mit 'ON' kann man, laut diverser Artikel keine Whre Bedingungen Anfügen.....
Ich werde nun versuchen die Where-Anweisungen aus der ForEach-Schleife auszulagern... Vielleicht reicht die Performance dann ja aus :).

Ich danke dir für deine Hilfe :)

Renke alias Tripophon
 
Nachtrag
Teil 2

Verbinden der Tabellen mit left join
---- Hmm ich blicke noch nicht ganz durch welche Tabelle mit
welcher verknüpft ist ---

Prinzip ist so:

Select * from A left join B on A.ID = B.ID
Tabelle A ist mit B über ID miteinander verknüpft
Um eine weitere Tabelle zu verknüpfen muss man gedanklich
eine Klammer um das Ergebnis setzen
(A left join B on A.ID = B.ID) left join C on a.id = c.id

Bedeutet nur das Ergebnis der Verküpfung geht in die weitere Verküpfung ein - spart Zeit :-)


klar kann man mit where arbeiten :-) auch bei left join
 
Zurück