Warum ist der Produktimport so langsam?

Immer wieder eine super spannende Sache: Ein Produktimport. Aber warum ist der Import von Produkten eigentlich so langsam? Hat Magento dort wirklich durch das Model-Konzept in Verbindung mit dem EAV totalen Mist gebaut? Liegt es daran das alle Daten doppelt und dreifach in irgendwelchen Indizes (oder Flat-Tables) gespeichert werden?

Vorab: Nein, wirklich Mist gebaut haben sie nicht. :) Ich habe mir das ganze einmal näher angeschaut und habe ein paar Tests durchgeführt.

"Benchmarks" zum Import

Der Begriff Benchmark ist nicht ganz ernst gemeint. Dafür habe ich zu wenig Tests gemacht - man konnte aber immer grob das Richtige ablesen. Ob ein Produkt nun 0.5 oder 0.6 Sekunden zum Importieren braucht ist letztlich irrelevant - es ist einfach zu langsam. Bei allen Tests waren die Magento-Indizes und Caches inaktiv.

Simple-Product mit 4 Attributen über das Magento Model: 0.4-0.6 Sekunden
Simple-Product mit 4 Attributen über eigene Api mit direkten DB-Zugriff: 0.3-0.5 Sekunden

Das war der Punkt wo ich wirklich ein wenig enttäuscht war muss ich sagen. Ich dachte mit direkten Zugriffen auf die Datenbank könnte man wirklich viel an der Performance-Schraube drehen. Aber da hab ich mich wohl geirrt.. Aber ein wenig neugierig war ich nun doch, warum zum Teufel ist das so langsam? Mein nächster Ansatz war es mir die Laufzeiten der SQL-Statements ein wenig näher anzuschauen:

100 Inserts in catalog_product_entity mit irgendwelchen Beispieldaten: 3-4 Sekunden

Langsam kam Bewegung in die Sache. 100 Inserts dauern schon 3 Sekunden? Das kann nicht sein. War aber leider wirklich so. Danach habe ich erst mal alle Indizes der Tabelle "catalog_product_entity" gelöscht und die Fremdschlüssel deaktiviert. Keine Große Veränderung. InnoDB scheint bei einem Insert einfach ziemlich langsam zu sein - zumindest in der Standardkonfiguration von Ubuntu. Läuft es bei euch deutlich schneller?

Dann hab ich erst mal die Tabelle catalog_product_entity dupliziert und auf die  Engine MyIsam umgestellt. Siehe da: Die Insert-Anweisungen waren super schnell. 10.000 Produkte mit jeweils 4 Attribute gingen in 20 Sekunden durch. Damit könnte ich leben. Aber liegt es nun an InnoDB direkt oder vielleicht an der komplexen Fremdschlüssel-Struktur? Leicht rauszufinden, Datenbankexport, alle Constraints aus dem SQL löschen und wieder importieren. Hat jedoch leider nicht geholfen:

100 Inserts in catalog_product_entity mit irgendwelchen Beispieldaten ohne Constraints (InnoDB) 3-4 Sekunden

Zurück zu der MyIsam -Lösung. Einen Dump ziehen, alle InnoDB in MyIsam umwandeln und wieder importieren. Constraints fliegen natürlich raus - kann MyIsam ja nicht.

100 Produkte über eine Alpha-Api mit direkten Datenbank-Zugriff (MyIsam) 0.3-0.4 Sekunden

Jetzt natürlich noch ein Test mit der original Magento-Api

100 Produkte mit dem Model "catalog/product" (MyIsam, ohne Indizes, ohne Cache) 31-32 Sekunden 100 Produkte mit dem Model "catalog/product" (MyIsam, mit Indizes, mit Cache) 50-52 Sekunden

Erstes Fazit: Ohne InnoDB und mit eigener Api, die direkt die Datenbank befüllt, könnte es klappen Produkte ziemlich schnell in das Magento-Backend zu laden. Es fehlen natürlich noch eine Vielzahl von Indizes und die Flat-Tables die gerade im Frontend von so hoher Relevanz sind. Dennoch müsste es möglich sein deutlich schneller als über das Model "catalog/product" zu sein.

Offene Fragen

Richtig logisch fühlt sich das nicht an. Vielleicht ist es nur ein Problem meiner Entwicklungsumgebung? Kann jemand meine Erfahrungen mit InnoDB/MyIsam nachstellen? Liegt es nur an meiner Konfiguration oder ist es ein generelles Problem von InnoDB? Anbei meine .



Ein Beitrag von Tobias Vogt
Tobias's avatar

Tobias Vogt arbeitet seit 2008 mit Magento und ist seit 2011 durch Magento zertifizierter Entwickler. Seit 2016 ist er Mitgründer und CTO bei der connect-io GmbH, einer Magento-Agentur mit Sitz im idyllischen Paderborn-Salzkotten. Er gehört zum Gründer-Team der Webguys und ist seit November 2011 Bachelor of Science (Wirtschaftsinformatik). Sie erreichen Ihn per E-Mail unter tobi@webguys.de.

Alle Beiträge von Tobias

Kommentare
eCommerce – Blog | Magento | Roman Zenner am

[...] Tobias Vogt hat das Thema Produktimporte näher beleuchtet und fragt sich  - zu Recht – Warum ist der Produktimport so langsam? Die gleiche Frage war scheinbar auch Grund für Matthias Zeis, einen längeren Beitrag über den [...]

Tobias Vogt am

Ja, das scheint ein InnoDB Problem auf einer Standard Ubuntu Installation zu sein. Du hast recht, auf "Echtservern" ist das Problem nicht nachzuvollziehen.

Thomas am

Ich habe das gerade eben auch ausprobiert. Ich habe die Tabelle catalog_product_entity auf MyIsam umgestellt und alle Constraints entfernt. Danach habe ich einen gewöhnlichen Magento Import durchgeführt (mit Magento Mitteln). An der Geschwindigkeit hat sich nicht wirklich was geändert. Dann habe ich mir das hier genannte Test Script geladen und die 1000 Produkte mal importiert, Ergebnis am Ende:

timer: finish (222.7484)

Dein Kommentar