Hilfe zu langsame Datenbank!

Nachdem ich nochmal länger darüber nachgedacht habe (war wirklich nicht offensichtlich) - ist es wirklich gar nicht nötig diese komplexe Suche durchzuführen. Es reicht tatsächlich aus, die Werte einfach nach dem leeren der Tabelle neu einzutragen! (thnxs @Dr.Dau)

Ich habe es jetzt so gelöst:
Code:
<?php
// Datenbankverbindung aufbauen
include '../logindb.php';
$connectionid  = mysql_connect($l1,$l2,$l3);
if (!mysql_select_db ($l4, $connectionid))
{
  die ("Ooops! Keine Verbindung zur Datenbank möglich, versuchen Sie es später erneut.");
}
//Tabelle leeren
mysql_query ('TRUNCATE TABLE `force_entry`');

	 $datei = "quelle.txt";  
                 $lines = file($datei);
	 $zeilen = count($lines);  
	 $count = 0;

while ($count < $zeilen)
{
			$line = $lines[$count];
     		                $zeile = explode('%|', trim($line));
	 		$a[$count] = $zeile[0];
	 		$b[$count] = $zeile[1];
	 		$ab[$count] = $zeile[0]."_".$zeile[1];
	 		$feld[$count] = $zeile[2];
	 		$herzog[$count] = $zeile[3];
	 		$punkte[$count] = $zeile[4];
				
    $sql = "INSERT INTO ".
    "force_entry ".
	"(ab,".
	" a,".
	" b,".
	" feld,".
	" herzog,".
	" punkte)".
	" VALUES ".
	"('$ab[$count]',".
	" '$a[$count]',".
	" '$b[$count]',".
	" '$feld[$count]',".
	" '$herzog[$count]',".
	" '$punkte[$count]')";
	// Daten eintragen
	mysql_query ($sql);
	echo "Eintrag: ".$count.", >".mysql_error();
	$count++;
}

Und das funktioniert auch bestens.....aber leider nur mit ca. 40% der Daten. Es werden ca. 22000 Einträge vorgenommen (in ca. 5 Sekunden!!), es sind aber 50000 (derzeit können auch mal 60000 sein).

Es kommt keine Fehlermeldung, die Seite wird einfach als "Fertig geladen" gekennzeichnet und ab ca. 22000 wird nichts mehr bearbeitet.

Eintrag: 21955, >Eintrag: 21956, >Eintrag: 21957, >Eintrag: 21958, >Eintrag: 21959, >Eintrag: 21960, >Eintrag: 21961, >Eintrag: 21962, >Eintrag: 21963, >Eintrag: 21964, >
letztes Echo (und auch DB Eintrag habe ich nachgeschaut)

Ich gehe jetzt mal davon aus das es sich um einen Timeout handelt o.ä. und ich die Eintragungen aufteilen muss.

Das könnte ich dann ja sicher mit fopen() machen (Thnxs @Gumbo) allerdings....bekomme ich es nicht hin die Datei bis zu einer bestimmten Zeile (meinetwegen in 20000er Schritten) einzulesen - und dann ab der darauffolgenden Zeile weitereinzulesen nachdem ich per PHP_Self o.ä. die Seite erneut aufrufe.

Würdet ihr mir da bitte mit einem Code-Schnipsel (für Dau`s) auf die Sprünge helfen.....

@Matthias Auch dir thnxs.....ich hoffe ich muss da nix an der DB ändern (last Resort) weil ich selbst das nicht darf.....also ändern lassen müsste (dann schlägt mich sicher der Admin - falls es einfacher gehen würde) :-)
 
Zuletzt bearbeitet:
Du sammelst wieder zu viele Variablen/Daten, die eigentlich unnötig sind. Mein Vorschlag:
PHP:
require_once '../logindb.php';

$link = mysql_connect($l1, $l2, $l3)
	or die('Verbindung zum Datenbankserver schlug fehl!');
mysql_select_db($l4, $link)
	or die('Auswahl der Datenbank schlug fehl!');

mysql_query('TRUNCATE TABLE `force_entry`');

$file = "quelle.txt";
$handle = fopen('quelle.txt', 'r');
$query = 'INSERT INTO `force_entry` (`ab`,`a`,`b`,`feld`,`herzog`,`punkte`) VALUES ';
while( !feof($handle) )	{
	$parts = explode('%|', trim(fgets($handle, 4096)));
	$query .= '("'.$parts[0].'_'.$parts[1].'", "'.$parts[0].'", "'.$parts[1].'", "'.$parts[2].'", "'.$parts[3].'", "'.$parts[4].'"),';
}
$query = substr($query, 0, -1);
mysql_query($query, $link)
	or die(mysql_error());
Ich hoffe, MySQL verträgt, dass alle Daten in einer Abfrage eingetragen werden.
 
5 Sekunden sind arg wenig..... irgendwo wird es also wohl ein Problem geben.
Wenn Du mal error_reporting(E_ALL) und mysql_error() nutzen würdest, würde man evtl. mehr Rückschlüsse ziehen können.
 
Wow!!
Danke an alle 3 die mir hier versucht haben zu helfen
Last but not least hat mir die letzte Antwort von Gumbo die ultimative Lösung bereit gestellt!
Die super Abfrage von Gumbo haut mir sämtliche Daten innerhalb von 1-2 Sekunden in die Datenbank rein!
DANKE!! :) :) :)

@Dr.Dau mysql_error() hab ich schon drinnen gehabt,,...und error_reporting(E_ALL) werde ich mir dank dir nun angewöhnen - danke!!

Original von Gumbo:Du sammelst wieder zu viele Variablen/Daten, die eigentlich unnötig sind
“Simple is good. Simplier is better.” <<< :D juhu (ich werde versuchen meine zukünftigen Codes nach diesem Prinzip zu gestalten! Das alte Jäger und Sammler Syndrom versuche ich in Zukunft zu vermeiden!! *NurGeilDerCode*)
 
Zuletzt bearbeitet:
Zurück