PHP + MYSQL ladezeit sowie Funktions bug

he1OO

Grünschnabel
Hi Leute,

Hab die SuFu benutzt und Google ohne Ende. Aber vielleicht kann mir ja jemand helfen.

Leider hab ich die Sachen net Online daher versuch ich es so gut wie möglich zu beschreiben.

***EDIT***
PHP und MYSQL
***EDIT***

Problem 1:
In einer Datenbank werden insgesamt 8 Werte gespeichert.
"date, id,name,city, usw."

Gut dazu hab ich eine Funktion geschrieben die mir mithilfe der ID den Namen des Users ausgibt. Klappt perfekt, dachte ich zumindest.

Nun rufe ich extern eine xml ab, speicher diese mit der PHP funktion file() in einen Array.
Soweit so gut. Danach geh ich mit foreach($lienes as $line) vor und teile sie nochmal so dass ich halt immer Index für Index durch gehen kann.

Als nächstes hole ich mir mit explode("," , $line); die Array Elemente.

bekomme dann natürlich mit Hilfe von
$wert1 = $nextline['0'];
$wert2 = $nextline['1'];
$wert3 = $nextline['2'];
$wert4 = $nextline['3'];
raus.

Gut passt perfekt Aber jetzt zum Problem.

Jetzt gebe ich Zeile für Zeile halt aus. Der erste Wert ist ein timestemp der funktioniert immer mit dem Umwandeln usw.
Der Zweite Wert ist eine Aktions ID. Diese ruf ich auch mit einer Funktion und anderen Tabelle ab und die gibt mir den Namen aus. Klappt auch in allen Zeilen.

Der dritte Wert gibt von einem User die ID von der ersten Tabelle aus.
Gut, Funktion geschrieben die mir den Namen zurück gibt. Klappt immer.

So nun zum Problem.
Der 4 Wert und letzte ist ebenfalls ein User bzw. die ID von dem. Jetzt verwende ich die Selbe Funktion wie beim Wert 3 und er gibt mir nur das erste Mal den User zurück aber danach nichtmehr. (Oder den letzten je wie ich die Array sortiere).

So nun zu meiner Frage kennt wer eine Lösung für das Problem. Wenn ich auf Platz 4 z.B. einfach den Wert 3 nutze klappt das mit den Namen auch. Wenn ich die funktion weglasse und einfach die ID ausgebe, klappts auch.

Nur wenn ich die Funktion nutze wobei der Wert4 auch 0 bzw. leer sein kann was ich allerdings überprüfe und einfach mithilfe von

if($nextline['3']!='' OR $nextline['3']!='') nimm funktion
else ist halt das.

kennt wer dafür ein Problem Lösung warum es hin und wieder geht und hin und wieder net. :( Bin echt schon Ratlos.

hier noch eine Funktion so wie ich sie schreibe. Die halt mit Wert 3 Immer Funktioniert aber mit Wert 4 nichtmehr :(
PHP:
function func_playername($id, $area, $world) {
	$db = mysql_fetch_array(mysql_query("SELECT name FROM ".dbname."xx_".$area."".$world."_player WHERE id='$id' ORDER BY date"));
	$name = $db['name'];
	$name = func_clearname($name);
	return $name;
}

Problem 2:
Ich hab in einer Datenbank derzeit 30 Einträge pro Seite und knapp 14.000Seiten (könnte auch die 40fache menge sein).

So ich brauch aus dieser Tabelle aber verschiedene Werte immer und immer wieder.

Hab auch hier wieder verschieden funktionen die halt immer mit
"SELECT name TABELE ..." usw. Arbeiten. Ich Versuch mit GROUP BY, ORDER BY, WHERE usw immer soviel wie möglich auszuschliesen was nur geht.

So das kann aber stellen weise bei 20Einträge (Ausgabe pro Seite) pro Seite ewig dauern bis die geladen sind. Stellen weise bis zu 20sec.

Gibts irgendwie ne möglichkeit solche Abfragen zu beschleunigen oder Tabellen zu optimieren mit z.B. views oder dergleichen?

Oder hat man bei so einer Datenmenge einfach pech.

mfg he1OO
 
Problem 1: Du könntest den 4. Wert nach INT casten und schauen, ob da eine 0 kommt:

if(intval($wert['3']) != 0) {
// Funktion aufrufen
}

Ein var_dump() des Arrays $next_line gibt dir allerdings den Datentypen zurück, den $wert['3'] hat.

Problem 2: Je mehr Konditionen du an den SELECT hängst, umso mehr muss MySQL filtern => umso größer ist der Aufwand => desto länger dauert es.

Du könntest auf die Spalten, die in den WHERE-Konditionen verwendet werden einen Index legen.
 
Problem 2: Je mehr Konditionen du an den SELECT hängst, umso mehr muss MySQL filtern => umso größer ist der Aufwand => desto länger dauert es.
Sry aber ganz falsch. Die Reihenfolge der Filter ist entscheidend und wie die gefilterten Datensätze weiter verwendet werden.

Wenn ich das richtig sehe, sendet he1OO die Abfragen in einer Schleife und das ist das Problem.
Sammle alle Schlüssel und mach daraus eine Abfrage. Ich habe ein ähnliche Tabelle mit ca 46k DS und um dort die richtig raus zu filtern, brauchen meine Abfragen nur ein paar Millisekunden.

Der Aufbau der Tabelle wäre auch interessant, ob sie den Normalformen entsprechen und wie Effektiv die Datentypen gewählt sind.

Setzte doch mal vor ein Query EXPLAIN, und zeig uns das Ergebnis.
 
Zuletzt bearbeitet:
Hi danke für die schnellen Antworten...

zu Problem 1)
Die Datenbank sind alle werte die Zahlen haben im INT erstellt und auch geprüft ob es eine 0 gibt und wenn sie null ist führ ich sie garnet aus. Wobei ich net versteh warum er die Funktion ka 1Zeile oberhalb mit den gleichen Werten im Prinzip schnallt.

Naja ich werd das mal morgen mit deinem Post probieren.
Erstmal Danke

@Napofis
Also die abfrage ist bei mir
PHP:
$nb = mysql_fetch_array(mysql_query("SELECT name ".dbname."_player WHERE id='$id' GROUP BY date ORDER BY date DESC LIMIT 0,1"));

$name = $nb['name'];
return $name;

Allerdings wird das auch net schneller wenn ich GROUP BY und co rausnehme oder einzelle sachen rausnehme.

Datenbank ist.
fID AUTO-INC int(11)
id int(11)
date int(14)
name varchar(255)
vill int(14)

Hoffe mal ich mach mich jetzt net zum affen. Aber im Prinzip hab ich alle So angelegt wenn nur Zahlen drin sind mit INT und wenn Text+Zahlen mit varchar und wenn extrem lange Texte mit Longtext.

Ich hoffe mal ich hab dich richtig verstanden aber im prinzip wenn ich den name will mit der ID mach ich es wie oben beschreiben. Wenn du natürlich ne besser Lösung kennst wäre cool wenn du mal SQL befehl zum erstellen schicken könntest und einen PHP/MYSQL abruf damit ich das testen kann.

Werd auch Query EXPLAIN morgen machen und nachtragen.

Aber erstmal Danke für eure Hilfe hab ich morgen bissi was zum testen :)
mfg he
 
Ist die ID wirklich eindeutig? Dann kannst du darauf einen Primary Key anlegen, was ein Index ist. Damit sollte die Abfrage deutlich schneller laufen.
 
Ist die ID wirklich eindeutig? Dann kannst du darauf einen Primary Key anlegen, was ein Index ist. Damit sollte die Abfrage deutlich schneller laufen.
Das geschieht bei der Option auto_increment automatisch.

Muss MySQL nicht für jede Konditionsprüfung eine Tempory-Table anlegen? Dann hab ich da was falsch in Erinnerung.
Eigentlich nur bei Verknüfungen, um eine ID zu finden nutzt das System die Indizes wenn angelegt, andernfalls werden alle Datensätze durchlaufen.
Soviel ich weiß.

he1OO hat gesagt.:
$nb = mysql_fetch_array(mysql_query("SELECT name ".dbname."_player WHERE id='$id' GROUP BY date ORDER BY date DESC LIMIT 0,1"));

Führe zB mal das aus:
SQL:
EXPLAIN SELECT name ".dbname."_player WHERE id=".$id." GROUP BY date ORDER BY date DESC LIMIT 0,1
Und schau dir die Ausgabe an. Das Group By Order By und Limit ist überflüssig da id ein eindeutiger Schlüssel ist.

he1OO hat gesagt.:
Datenbank ist.
fID AUTO-INC int(11)
id int(11)
date int(14)
name varchar(255)
vill int(14)
Ein int kann folgende Darstellungsgrößen annehmen.
-2.147.483.648 bis 2.147.483.647 oder 0 bis 4.294.967.295
Das sind max. 11 Zeichen (Punkte wegdenken) int(14) ist also Quatsch.
he1OO hat gesagt.:
extrem lange Texte mit Longtext.
In einem Longtext Feld kannst du Strings in einer Länge von bis zu 4.294.967.295 Zeichen speichern. Das wären alle Harry Potter Bände! Und entspricht einer Datenmenge von bis zu 4GB pro Datensatz. brauchst du das wirklich?

he1OO hat gesagt.:
Ich hoffe mal ich hab dich richtig verstanden
Nein, du rufst jeden User einzeln ab und das belastet eine Datenbank extrem. Sammle alle User IDs in einem Array und rufe alle User mit einem Query ab.
 
Zuletzt bearbeitet von einem Moderator:
Danke nochmal für die Antworten und werd das jetzt alles mal durchprobieren und dann wieder kurz melden.

@saftmeister
Ist nix anderes als die Tabelle.

".dbname." für derzeit x45_22 und _player ist die Tabelle.

in meiner Datenbank sind alle Tabellen mit z.B.
x45_22_settings
x45_22_player
x45_22_user

usw vorhanden :)

mfg
 
Auf welche Frage hast du hier geantwortet? Kannst du mal denn SQL-Query DESCRIBE $tablename absenden und das Ergebnis hier posten?

Du führst einen Query durch, der eine Kondition beinhaltet für die Spalte "id". Diese Spalte "id" hat für mich keinen offensichtlichen Index. Ich möchte vergewissern, ob das tatsächlich so ist, dann genügt es, einen Index (Primary Key oder Unique bieten sich) auf diese Spalte zu legen. Das würde die Suche um einiges beschleunigen.
 
Zurück