Hallo,
hab eine navigation für einen Shop
die sich aus verschiedenen Attributen zusammen setzt.
- Verwendung (Lifestyle,Fussbal etc...)
- Artikelart ( Schuhe, Armbänder, Mützen etc...)
- Geschlecht
verschiedenste Merkmale eines Artikels werden natürlich auch in anderen Tabellen ausgelagert wie zb.:
- geschlecht
- farbe1 und 2
- marke usw...
der ursprungliche INNER JOIN geht über 6 Tabellen um die Navigation zusammen zu bauen. Das ganze ging bei rund 300 Artikel auch noch ganz flott...
-> Zuweisung dient dazu um zu wissen in welchen Verwendungen der Artikel und und welche Artikelart er angehört.
-> groessen_zuweisung sind die dazugehörigen Größen inkl Mengen
Ziel der Abfrage war es das nur Menüpunkte angezeigt werden(Verwendungen und in ebene 2 Artikelart) in denen auch wirklich Artikel mit entweder:
- Bestand > 0 ist
- atkiv = 1 (aktiviert)
- und ein bild haben t7.id_artikel IS NOT NULL
Gestern hab ich dann mal test Insert´s in die Datenbank gespielt mit:
6000 Artikeln
jeder artikel 6 Groessen (32000 Groessen)
und eine zuweisung (6000)
tja und danach war es auch mit flott...dachte immer mit JOINS kann man so etwas optimal verknüpfen.
Was mir auch komisch vorkommt ist das ich mal ein Test Join mit 3 Tabellen gemacht hab um nur das wichtigste abzufragen
und da hat er mir direkt im PHP myadmin die Abfrage in 0.0041 Sekunden ausgeben um eine Verwendung(Menüpunkt zu überprüfen)
Wenn ich aber das ganze jetzt im Script wie folgt ausführen lassen braucht der Hansel doch glatt 2-3 Sek für eine Verwendung zum überprüfen!!!
Wie kann das sein arbeitet die Schnittstelle zwischen mysql und php so lahm?!
hier der Testjoin code für die Navigation:
Wie kann ich die Performance da steigern?
Oder hat jemand einen guten LINK für mich bei dem dieses Thema schon behandelt wird? Oder einen Buchkauftipp?
hab eine navigation für einen Shop
die sich aus verschiedenen Attributen zusammen setzt.
- Verwendung (Lifestyle,Fussbal etc...)
- Artikelart ( Schuhe, Armbänder, Mützen etc...)
- Geschlecht
verschiedenste Merkmale eines Artikels werden natürlich auch in anderen Tabellen ausgelagert wie zb.:
- geschlecht
- farbe1 und 2
- marke usw...
der ursprungliche INNER JOIN geht über 6 Tabellen um die Navigation zusammen zu bauen. Das ganze ging bei rund 300 Artikel auch noch ganz flott...
PHP-Code:
SELECT t1.id_verwendung, t1.verwendung
FROM $tbl_verwendung as t1
INNER JOIN $tbl_zuweisung as t2 ON t1.id_verwendung = t2.id_verwendung
INNER JOIN $tbl_artikel as t3 ON t2.id_artikel = t3.id_artikel
INNER JOIN $tbl_groessen_zuweisung as t4 ON t3.id_artikel = t4.id_artikel
INNER JOIN $tbl_geschlecht as t5 ON t3.id_geschlecht = t5.id_geschlecht
INNER JOIN $tbl_marke as t0 ON t0.id_marke = t3.id_marke
INNER JOIN $tbl_bild as t7 ON t7.id_artikel = t3.id_artikel
WHERE t4.anzahl > 0
AND t7.id_artikel IS NOT NULL
GROUP BY t1.id_verwendung ORDER BY t1.verwendung
-> groessen_zuweisung sind die dazugehörigen Größen inkl Mengen
Ziel der Abfrage war es das nur Menüpunkte angezeigt werden(Verwendungen und in ebene 2 Artikelart) in denen auch wirklich Artikel mit entweder:
- Bestand > 0 ist
- atkiv = 1 (aktiviert)
- und ein bild haben t7.id_artikel IS NOT NULL
Gestern hab ich dann mal test Insert´s in die Datenbank gespielt mit:
6000 Artikeln
jeder artikel 6 Groessen (32000 Groessen)
und eine zuweisung (6000)
tja und danach war es auch mit flott...dachte immer mit JOINS kann man so etwas optimal verknüpfen.
Was mir auch komisch vorkommt ist das ich mal ein Test Join mit 3 Tabellen gemacht hab um nur das wichtigste abzufragen
und da hat er mir direkt im PHP myadmin die Abfrage in 0.0041 Sekunden ausgeben um eine Verwendung(Menüpunkt zu überprüfen)
Wenn ich aber das ganze jetzt im Script wie folgt ausführen lassen braucht der Hansel doch glatt 2-3 Sek für eine Verwendung zum überprüfen!!!
Wie kann das sein arbeitet die Schnittstelle zwischen mysql und php so lahm?!
hier der Testjoin code für die Navigation:
PHP-Code:
// Start Auflistung der Navigation
echo '<ul id="navigation">';
$sel_verwendungcheck = "SELECT * FROM $tbl_verwendung order by verwendung ASC";
$res_verwendungcheck = mysql_query($sel_verwendungcheck);
echo mysql_error();
while($row_verwendungcheck=mysql_fetch_object($res_verwendungcheck))
{
$id_verwendungcheck[] = $row_verwendungcheck->id_verwendung;
$verwendungcheck[] = $row_verwendungcheck->verwendung;
}
for($t=0;$t<=mysql_num_rows($res_verwendungcheck);$t++)
{
$zeit1 = date("H:i:s");
$sel_zuweisung = "SELECT * FROM s_zuweisung as t1
LEFT JOIN s_groessen_zuweisung as t2 ON t2.id_artikel = t1.id_artikel
LEFT JOIN s_artikel as t3 ON t3.id_artikel = t1.id_artikel
WHERE t1.id_verwendung = '$id_verwendungcheck[$t]' and t3.aktiv = '1' and t2.anzahl > '0'";
$res_zuweisung = mysql_query($sel_zuweisung);
if(mysql_num_rows($res_zuweisung))
{
// AUSGABE VERWENDUNGEN
echo '<li class="ebene1"><a href="'.$_SERVER['PHP_SELF'].'?id_verwendung='.$id_vercheck.'&id_marke='.$_REQUEST['id_marke'].'
&id_geschlecht_main='.$_REQUEST['id_geschlecht_main'].'&markensuche='.$_REQUEST['markensuche'].'">
'.$zeit1.' '.$verwendungcheck[$t].' '.date("H:i:s").'</a>';
}
}
echo '</ul>';
Oder hat jemand einen guten LINK für mich bei dem dieses Thema schon behandelt wird? Oder einen Buchkauftipp?
Kommentar