[MySQL] Kann mir mal bitte einer EXPLAIN erklären?

ostsan

Well-known member
ID: 57024
L
3 Mai 2006
429
48
Hi

Ich wollte mir mal ein bischen mit mehr mit mysql + php beschäftigen
vorallem mit der Optimierung von Codes.

Nachdem ich habe gesucht wie ein blöder und finde zwar immer was mir EXPLAIN ausgiebt aber nicht wie:ugly:

funktionieren müsste es ja so
PHP:
mysql_query("EXPLAIN SELECT * FROM tabelle1 WHERE id = '1'");
und dann ? ein fetch düber und den dann anzeigen ? aber was ?

Jetzt kommt gleich mom lass mal das * weg und gib an was du von der tabelle wilst. Das weiss ich schon. und nimm vorallem JOINs her. Das weiss ich auch schon das das die DB entlastet. Aber dieses EXPLAIN um die Abfragen zu checken ob das was bringt.

Also helft mir doch bitte mal

mfg
ostsan
 
Und ich kann dir nur empfehlen, dir die Ausgaben von EXPLAIN zu Herzen zu nehmen.
Hab hier ein Script, das früher mal ca. 45 Sekunden zur Ausführung benötigt hat. Nachdem ich das Tabellendesign und die Queries ein wenig optimiert habe, braucht es jetzt nur noch ca. 5 Sekunden!

Gruß,
Xgame
 
Am einfachsten ist es, den Query in $mysqltooldeinerwahl zu kopieren und EXPLAIN vorzuschreiben.
 
hi sorry das ich mich zwischen schalte

aber ich hab das grad mal im phpmyadmin ausgeführ mit meinem Query ud dann kam das

table type possible_keys key key_len ref rows Extra
u const PRIMARY PRIMARY 4 const 1
r const PRIMARY PRIMARY 4 const 1
a const PRIMARY PRIMARY 4 const 1

was sagt mir das nun genau ??? gibts da übersichten ?
 
es gibt kein sry fürs dazwischen mischen :) dafür ist es ein Forum

Ich sag mal danke für die Antworten das mit dem im phpmyadmin eingeben war ne super hilfe ;) Endlich kriege ich werte

dabei habe ich gleich was festgestellt dieses LIMIT x hilft nicht wirklich was :(

ich habe testweise einfachmal in einer Tabelle eingegeben wo 400 Datensätze drin sind

PHP:
EXPLAIN SELECT uid FROM user WHERE last_activ > '0' LIMIT 50;

Und was war das ergebnis ? er hat alle Datensätze der Tabelle durchsucht hab ich da was verkehrt gemacht ? oder is das LIMIT nur für php da.

mfg
OstSan
 
ostsan schrieb:
PHP:
EXPLAIN SELECT uid FROM user WHERE last_activ > '0' LIMIT 50;

Und was war das ergebnis ? er hat alle Datensätze der Tabelle durchsucht hab ich da was verkehrt gemacht ? oder is das LIMIT nur für php da.

mfg
OstSan

Die Ausführung wird abgebrochen, sobald x Werte ermittelt wurden (LIMIT x). Vielleicht bringt der Abbruch bei 400 Zeilen nicht mehr wirklich was. Ein Fulltablescan sollte da ja eh nur sehr sehr wenig Zeit benötigen.

Grundsätzlich ist dieses Kapitel sicher interessant für dich:
https://dev.mysql.com/doc/refman/4.0/de/query-speed.html

Insb für das LIMIT dieses hier:
https://dev.mysql.com/doc/refman/4.0/de/limit-optimisation.html

Gruß, Zera
 
Und ich hab noch ein problem und zwar mit nem JOIN das is nich so mein Ding bis jetzt ist der Code so
PHP:
$forcedbanner = db_query("SELECT tan, banner, reload, verdienst, aufendhalt FROM ".$db_prefix."_gebuchte_werbung WHERE menge >='1' and werbeart = 'forcedbanner' and status = '1' and sponsor != '".$_SESSION['uid']."' ORDER BY verdienst DESC LIMIT '".$max_banner."'");

while($f_banner=mysql_fetch_array($forcedbanner)){

$int_reload = db_query("SELECT tan FROM ".$db_prefix."_reloads WHERE tan='".$f_banner['tan']."' and  (uid='".$_SESSION['uid']."' or ip='".$ip."') and bis >= ".time()."");
$x_banner = "0";
    if (!mysql_num_rows($int_reload) && $x_banner <= ($max_banner-1)) {
        $x_banner++;

Und mit nem JOIN wolte ich das so lösen aber es ist nicht das gleiche ergebnis irgendwas hab ich da falsch ich weiss nur nich was :(

PHP:
$forcedbanner = db_query("SELECT ".$db_prefix."_gebuchte_werbung.tan, ".$db_prefix."_gebuchte_werbung.banner, ".$db_prefix."_gebuchte_werbung.reload, ".$db_prefix."_gebuchte_werbung.verdienst, ".$db_prefix."_gebuchte_werbung.aufendhalt FROM ".$db_prefix."_gebuchte_werbung LEFT JOIN ".$db_prefix."_reloads ON (".$db_prefix."_gebuchte_werbung.tan != ".$db_prefix."_reloads.tan AND ".$db_prefix."_reloads.uid != '".$_SESSION['uid']."' AND ".$db_prefix."_reloads.bis >='".time()."' OR ".$db_prefix."_reload.ip != '".$ip."') WHERE ".$db_prefix."_gebuchte_werbung.werbeart = 'forcedbanner' AND ".$db_prefix."_gebuchte_werbung.status = '1' and ".$db_prefix."_gebuchte_werbung.sponsor != '".$_SESSION['uid']."' ORDER BY ".$db_prefix."_gebuchte_werbung.verdienst DESC LIMIT '".$max_banner."'");

while($f_banner=mysql_fetch_array($forcedbanner)){
$x_banner = "0";
    if ($x_banner <= ($max_banner-1)) {
        $x_banner++;


Könntest du da mal schnell drüberfliegen was ich da falsch gemacht hab ?

*edit Aber bittenicht den Fertigen Code hinschreiben eher erklären wo ich da nen Hund reingehauen habe sonst kapiere ich die JOINs ja nie ;)
 
zuerst mal sollte man Zahlen als Zahlen speichern und den Rest als Text. Und eine Menge ist 99,9999% schon mal eine Zahl.