• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

mysql abfrage optimieren?

TecEye

New member
Hy leute, hab hier ne anfrage die über ajax ausgeführt wird, es liest die Felder aus, löscht alle sonderzeichen ü. Leerzeichen usw. und speichert wieder ab:
PHP:
$sql = mysql_query("SELECT * FROM datix_upload_".$con1." ORDER BY id ASC");
while($row = mysql_fetch_array($sql))
{
	$con1_code 	= $row['code'];
	$new_row	= "code = '".$con1_code."'";
	for ($i = 2; $i < $count_spalten_con1; $i++){
		$spalte	= mysql_field_name($spalten_con1, $i);
		$count_entry	= mysql_result(mysql_query("SELECT COUNT(*) as Num FROM datix_upload_".$con1." WHERE ".$spalte." != ''"),0);
		if($count_entry >= 1){
		$new_row		.= ", ".$spalte." = '".trim(preg_replace("/[^a-zA-Z0-9_äöüÄÖÜ.\s\s+]/" , "" , $row[''.$spalte.'']))."'";
		++$x;
		}
	}
	mysql_query("UPDATE datix_upload_".$con1." SET ".$new_row." WHERE code='".$con1_code."'") OR die(mysql_error());
}
Funktioniert auch soweit, aber so ab 2-3.000 Einträgen in der DB schmiert das Skript ab und gibt "Verbindung zu mysql wurde getrennt" aus. Ist wohl überfordert mit der Bearbeitung. Gibt es ev eine sauberere Lösung?
 
schmiert das Skript ab und gibt "Verbindung zu mysql wurde getrennt" aus. Ist wohl überfordert mit der Bearbeitung.
Datenbankunabhängige Überlegungen:
Mal in den Bedingungen beim Provider geschaut, ob es eine maximale Scriptlaufzeit oder CPU Beanspruchung auf dem Server gibt?
Muss denn diese "Bereinigung" jedes mal durchgeführt werden?
Kann man die zu bearbeitende Datenmenge nicht in logisch sinnvolle kleinere "Happen" aufteilen und/oder ein Flag für bereits bearbeitete Tabellenteile setzen?
 
wo kann ich diese Bedingungen nachlesen?

Wie meinst du in Happen? Es ist ein Programm für mich, wo ich Adressdaten reinladen kann, sind immer so zwischen 2-15.000er CSVs, die stehn dann zur weiteren aufbereitung zur Verfügung, aber so wie es aussieht packt der Server diese Datenmenge nicht. Ich glaube ev liegts am Skript dass zu aufgebläht ist, da gibts doch bestimmt bessere Wege oder? Oder wie mach ich das in Happen?
 
Warum bereinigst du die Daten nicht gleich beim Laden aus der CSV und speicherst in der DB nur das bereinigte Ergebnis?
Mit Happen meine ich die Portionierung der Datenmenge, eben auf ein geringeres Maß pro Durchlauf begrenzen, damit der Serverkill nicht zuschlägt.
Wo du die Providerbedingungen findest weiß ich nicht. Schau mal im Vertrag und den Details dazu.
 
Nunja es gibt noch viel mehr prüfungen die davor und danach ausgeführt werden, außerdem will ich die bearbeitung und die einzelnen schritte visualisieren. Hast du ne Idee wie ich genau die sache portioniere?
 
Nunja es gibt noch viel mehr prüfungen die davor und danach ausgeführt werden, außerdem will ich die bearbeitung und die einzelnen schritte visualisieren. Hast du ne Idee wie ich genau die sache portioniere?
Also ich weiß ja nicht, was das für aufwändige Prüfungen sind, aber ich würde das als Shell-Skript(e) verfassen, welche die CSV Dateien _vor_ dem Import in die Datenbank entsprechend aufbereiten (grep, awk, sed, cut, usw. sind Deine Freunde und die gibt es auch für Windows).
Wenn es Felder gibt, die umgerechnet werden müssen, und welche man leichter mit SQL (direktes SQL auf der Datenbank, nix PHP), sprich ein einziger SQL Befehl für ein oder mehrere gegebene Datenfelder, dann nutzt man natürlich die Datenbank. Das passiert aber erst _nachdem_ die Vorbereitung per Shell-Skript(e) abgeschlossen ist.

Eine Verarbeitung mit PHP sollte nur in äußersten Notfällen eingesetzt werden. Deiner ist kein Notfall. Zwei geschachtelte Schleifen mit zwei SQL-Statements in der Schleife, eines davon in der innersten und einer SQL-Abfrage aussenrum, ist bei der Datenmenge, die Du planst tödlich (was Du ja auch schon beobachtet hast - Stichwort: max_execution_time).
 
Zurück
Oben