Antworten auf deine Fragen:
Neues Thema erstellen

php mysql performanceproblem

buyas

Nicht mehr ganz neu hier

hi !
ich habe ein ziemliches performanceproblem und hab leider keinen schimmer woran es liegen könnte. habe ziemlich viel im internet gesucht und keine lösung gefunden. alles, was ich gefunden habe, ist, dass man sich bei bis zu ein paar millionen datensätzen in einer tabelle keine großen sorgen machen brauchen soll - ja toll, meine tabelle hat aber "nur" < 425.000 datensätze.
die tabelle ( loctbdu ) sieht wie folgt aus:
locId, country, city, postalCode, latitude, longitude sind die spalten, also 6 an der zahl.
und datensätze gibt es, wie schon erwähnt < 425.000.

der php code mit der abfrage:

PHP:
$sqlcity="SELECT laenderkuerzel.countryname, loctbdu.country, loctbdu.city FROM laenderkuerzel, loctbdu WHERE laenderkuerzel.countryname='".$cncheck."' and loctbdu.country=laenderkuerzel.alphadu";
$db_ergcity=mysql_query($sqlcity);

$sqlcitysudu="SELECT laenderkuerzel.countryname, loctbdu.country, loctbdu.city FROM laenderkuerzel, loctbdu WHERE laenderkuerzel.countryname='".$cnsuducheck."' and loctbdu.country=laenderkuerzel.alphadu";
$db_ergcitysudu=mysql_query($sqlcitysudu);


$sqlcitybi="SELECT laenderkuerzel.countryname, loctbdu.country, loctbdu.city FROM laenderkuerzel, loctbdu WHERE laenderkuerzel.countryname='".$cnbicheck."' and loctbdu.country=laenderkuerzel.alphadu";
$db_ergcitybi=mysql_query($sqlcitybi);



$sqlcitybidu="SELECT laenderkuerzel.countryname, loctbdu.country, loctbdu.city FROM laenderkuerzel, loctbdu WHERE laenderkuerzel.countryname='".$cnbiducheck."' and loctbdu.country=laenderkuerzel.alphadu";
$db_ergcitybidu=mysql_query($sqlcitybidu);


$cncheck, $cnsuducheck, usw. sind ländernamen, die über ein formular kommen / übergeben werden.

in der tabelle laenderkuerzel sind ländername und kürzel in separaten spalten gespeichert.
es werden also über ein formular ländernamen abgefragt in der tabelle laenderkuerzel sich das kuerzel geschnappt und mit diesem in der tabelle nach allen städten des dazugehörigen landes geholt.
angezeigt werden die städte dann in vier select listen, die wie folgt aussehen:

PHP:
echo "<p style='position:absolute; top:75px; left:7px; font-family: Arial, Helvetica, sans-serif; font-size : 14.2px; font-weight:;'>

Von:

</p>


<div class='styled-select' style='position:absolute; display:block; top: 83px; left:60px;'>

   <select class='' style='' name='vonabfra'>";
while($zeilecity = mysql_fetch_array( $db_ergcity, MYSQL_ASSOC))
{

echo "<option>".$zeilecity['city']."</option>";

}



echo "</select>

</div>";

wenn die seite nun lädt, braucht es ewig bis sie tatsächlich vollständig geladen ist und das laden stockt immer bei den select listen.
ich wäre so dankbar für ideen, woran das liegen könnte !! bekomm das schon seit einer woche nich hin :( ..
vielen dank im voraus und einen schönen tag allen !
 

Duddle

Posting-Frequenz: 14µHz

AW: php mysql performanceproblem

Der erste Ansatz ist immer: hast du die Spalten indiziert?



Zweitens: wenn es sich anbietet, solltest du die drei Anfragen vereinen. Sie unterscheiden sich ja nur in einem Kriterium, also sollte sowas wie
PHP:
SELECT laenderkuerzel.countryname, loctbdu.country, loctbdu.city FROM laenderkuerzel, loctbdu WHERE laenderkuerzel.countryname IN ($cncheck, $cnsuducheck, $cnbicheck)  and loctbdu.country=laenderkuerzel.alphadu;
alle relevanten Zeilen enthalten. Wenn das potenziell nicht zu viele Daten sind, liest du sie alle in ein Array und prüfst dann beim drüber-iterieren nach dem gewünschten countryname.


Duddle
 

buyas

Nicht mehr ganz neu hier

AW: php mysql performanceproblem

indizes habe ich auf den spalten countryname, alphadu, country und city.

@duddle:
habe es mit deinem codevorschlag probiert, dauert leider genau so lange.
selbst bei nur einem anwenden auf eine select liste mittels while-schleife stockt das laden der seite bei genau dieser liste und es dauert mehrere sekunden bis fertig geladen ist.
pro variable ( $cncheck usw. ) werden im schnitt 1.000 aus 425.000 datensätzen selektiert.
sind da mehrere sekunden nicht ein bissl arg viel :s ?
 

Duddle

Posting-Frequenz: 14µHz

AW: php mysql performanceproblem

Woher nimmst du die 425.000 Datensätze? Ist das die Menge des Kreuzproduktes oder einer der teilnehmenden Tabellen. Wenn eine Tabelle 420k und die andere nochmal 2k Einträge hat, ist das Kreuzprodukt schon 840 Mio-Einträge schwer.
Falls es nur 420k sind, sollte das unter einer Sekunde bleiben.

Schau dir mal an, was EXPLAIN dazu sagt, also geh in dein phpMyAdmin o.ä. und führe aus
Code:
EXPLAIN SELECT laenderkuerzel.countryname, loctbdu.country, loctbdu.city FROM laenderkuerzel, loctbdu WHERE laenderkuerzel.countryname='".$cncheck."' and loctbdu.country=laenderkuerzel.alphadu
Natürlich setzt du einen sinnvollen Wert für $cncheck ein.
Dieses Ergebnis (mit Tabellenkopf) kannst du mal hier posten, vielleicht sieht man etwas sehr offensichtliches.


Duddle
 

buyas

Nicht mehr ganz neu hier

AW: php mysql performanceproblem

das mit dem kreuzprodukt hört sich interessant an.
EXPLAIN ergab folgendes:

Code:
id | select_type | table         | type | possible_keys        | key         | key_len  | ref                        | rows | Extra            
1  | SIMPLE    | laenderkuerzel | ref   | countryname,alphadu | countryname | 122       | const                        | 1 | Using where               
1  | SIMPLE    | loctbdu        | ref   | country             | country      | 4        | ffgfg.laenderkuerzel.alphadu | 732
sieht, glaub ich, nich so dramatisch aus das ganze oder ?

übrigens in der tabelle laenderkuerzel sind ca. 250 datensätze und in der tabelle loctbdu sind 425.000 ...


edit:
das kann doch nich sein, dass ne abfrage, die 732 ergebnisse liefert, die in ne auswahlliste ausgegeben werden mehrere sekunden dauert :s ..
hab es mal nur mit der einen tabelle ( loctbdu ) mit den 425.000 datensätzen probiert, sprich kreuzprodukt ist ausgeschlossen, trotzdem dauert es mehrere sekunden ..
kann es sein, dass es entweder damit zu tun haben könnte, dass die daten aus ner csv - datei stammen, die ich in die tabelle eingefügt hab oder dass meine datenbank momentan in der entwicklungsphase noch bei bplaced.net liegt und es hardwaretechnische gründe von deren seite haben könnte ?
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.635
Beiträge
1.538.461
Mitglieder
67.558
Neuestes Mitglied
StarsMan
Oben