Hallo Leute,
ich stehe mal wieder vor einem Problem welches ich mir nicht erklären kann.
Ich möchte Produktdaten aus einer CSV-Datei in eine Datenbank importieren. Es sind ca. 100.000 Produkte. Um dabei nicht in einen Timeout rein zu laufen, importiere ich Pakete mit je 1.000 Produkte. Das heisst, nach jedem 1.000sten Produkt ruft sich das Script immer wieder selber auf, solang bis alle Produktdaten aus der CSV abgearbeitet sind - ich nenne diese Selbstaufrufe jetzt einfach mal "Prozesse".
Bei diesen "Prozessen" wird geprüft, ob das jeweilige Produkt schon existiert - wenn ja, wird ein UPDATE des Produkts ausgeführt, wenn nein wird ein INSERT in eine temoräre Datenbank ausgeführt. Und genau bei diese Prüfung liegt mein Problem. Von Prozess zu Prozess wird die Prüfung auf Existens des Produkts immer langsamer bis hin zum Timeout.
Lasse ich die Prüfung weg und importiere die Produkte in die temporäre Datenbank, arbeiten die Prozesse alle 100.000 Produkte ohne Probleme ab.
Kann mir jemend dieses "Ausbremsen" erklären?
Hier mal das Snippet:
Alles anzeigen
Schon mal Danke.
Grüße KMD
ich stehe mal wieder vor einem Problem welches ich mir nicht erklären kann.
Ich möchte Produktdaten aus einer CSV-Datei in eine Datenbank importieren. Es sind ca. 100.000 Produkte. Um dabei nicht in einen Timeout rein zu laufen, importiere ich Pakete mit je 1.000 Produkte. Das heisst, nach jedem 1.000sten Produkt ruft sich das Script immer wieder selber auf, solang bis alle Produktdaten aus der CSV abgearbeitet sind - ich nenne diese Selbstaufrufe jetzt einfach mal "Prozesse".
Bei diesen "Prozessen" wird geprüft, ob das jeweilige Produkt schon existiert - wenn ja, wird ein UPDATE des Produkts ausgeführt, wenn nein wird ein INSERT in eine temoräre Datenbank ausgeführt. Und genau bei diese Prüfung liegt mein Problem. Von Prozess zu Prozess wird die Prüfung auf Existens des Produkts immer langsamer bis hin zum Timeout.
Lasse ich die Prüfung weg und importiere die Produkte in die temporäre Datenbank, arbeiten die Prozesse alle 100.000 Produkte ohne Probleme ab.
Kann mir jemend dieses "Ausbremsen" erklären?
Hier mal das Snippet:
Quellcode
- // Prüfen ob der Datensatz schon existiert. Wenn ja, updaten ansonsten neu schreiben
- $database->db_query("pruefung", "SELECT * FROM ".$mysql_table_produkte_test." WHERE ProgramID = '".$ProgramID."' AND MerchantProductNumber = '".$MerchantProductNumber."' LIMIT 1");
- if($database->db_get_num_results("pruefung") == 1)
- {
- // Daten in Produkt-Datenbank updaten
- $database->db_query("updaten", "UPDATE ".$mysql_table_products." SET ProductName = '".$ProductName."', ProductPrice = '".$ProductPrice."', ProductPriceOld = '".$ProductPriceOld."', CurrencySymbolOfPrice = '".$CurrencySymbolOfPrice."', ValidFromDate = '".$ValidFromDate."', ValidToDate = '".$ValidToDate."', ProductShortDescription = '".$ProductShortDescription."', ProductLongDescription = '".$ProductLongDescription."', ImageSmallURL = '".$ImageSmallURL."', ImageMediumURL = '".$ImageMediumURL."', ImageLargeURL = '".$ImageLargeURL."', ZanoxProductLink = '".$ZanoxProductLink."', DeliveryTime = '".$DeliveryTime."', TermsOfContract = '".$TermsOfContract."', ProductEAN = '".$ProductEAN."', ISBN = '".$ISBN."', ShippingAndHandling = '".$ShippingAndHandling."', ShippingAndHandlingCost = '".$ShippingAndHandlingCost."', kategorie_id = '".$kategorie_id."' WHERE ProgramID = '".$ProgramID."' AND MerchantProductNumber = '".$MerchantProductNumber."' LIMIT 1");
- }
- else
- {
- // Daten in temporäre Datenbank schreiben
- $database->db_query("einfuegen", "INSERT INTO ".$mysql_table_products_temp." (ProgramID, MerchantName, MerchantProductNumber, ProductName, ProductPrice, ProductPriceOld, CurrencySymbolOfPrice, ValidFromDate, ValidToDate, ProductShortDescription, ProductLongDescription, ImageSmallURL, ImageMediumURL, ImageLargeURL, ProductManufacturerBrand, ZanoxProductLink, DeliveryTime, TermsOfContract, ProductEAN, ISBN, ShippingAndHandling, ShippingAndHandlingCost, kategorie_id, status) VALUES ('$ProgramID', '$MerchantName', '$MerchantProductNumber', '$ProductName', '$ProductPrice', '$ProductPriceOld', '$CurrencySymbolOfPrice', '$ValidFromDate', '$ValidToDate', '$ProductShortDescription', '$ProductLongDescription', '$ImageSmallURL', '$ImageMediumURL', '$ImageLargeURL', '$ProductManufacturerBrand', '$ZanoxProductLink', '$DeliveryTime', '$TermsOfContract', '$ProductEAN', '$ISBN', '$ShippingAndHandling', '$ShippingAndHandlingCost', '$kategorie_id', 'Aktiv')");
- }
Schon mal Danke.
Grüße KMD