InnoDB fügt sehr langsam ein und verlangsamt sich

9

Ich habe kürzlich meine Projekttabellen auf InnoDB umgestellt (denke, dass die Beziehungen eine gute Sache wären). Ich verwende ein PHP-Skript, um etwa 500 Produkte gleichzeitig zu indizieren.

Eine Tabelle, die das Wort / IDs speichert:

%Vor%

Eine andere Tabelle speichert Produkt-ID / Wort-ID-Zuordnungen:

%Vor%

Das Skript wurde mit MyISAM getestet und indiziert Produkte relativ schnell (viel, viel schneller als InnoDB). Beim ersten Lauf in InnoDB war es lächerlich langsam, aber nachdem ich mehrere Werte verschachtelt hatte, beschleunigte ich es um einiges (aber nicht genug).

Ich würde annehmen, innodb wäre wegen dieser Zeilensperren viel schneller für diese Art von Sache, aber das ist nicht der Fall.

Ich konstruiere eine Abfrage, die ungefähr wie folgt aussieht:

%Vor%

Ich erstelle eine Schleife und fülle ein Array mit allen Wörtern, die zu Windex und allen Wort-ID / Produkt-ID-Paaren hinzugefügt werden müssen, die zu indx_0 hinzugefügt werden müssen.

Da innodb meine Autoinkrementwerte immer erhöht, wenn ich "REPLACE INTO" oder "INSIGN IGNORE INTO" einlege, was aufgrund von doppelten Werten fehlschlägt, muss ich sicherstellen, dass die von mir hinzugefügten Werte nicht bereits existieren. Um das zu tun, wähle ich zuerst alle Werte aus, die mit einer Abfrage wie der folgenden existieren:

%Vor%

Dann filtere ich mein Array mit den Ergebnissen, die existieren, so dass alle neuen Wörter, die ich hinzufüge, 100% neu sind.

Dies dauert etwa 20% der gesamten Ausführungszeit. Die anderen 80% gehen in das Hinzufügen der Paarwerte zu indx_0, für die es viel mehr Werte gibt.

Hier ist ein Beispiel dafür, was ich bekomme.

0,4806 Sekunden, um Produkte auszuwählen. (0.4807 s insgesamt).
0,0319 Sekunden, um 500 Gegenstände zu sammeln. (0.5126 s insgesamt).
5,2396 Sekunden, um die Windex-Werte für den Vergleich auszuwählen. (5,7836 Sekunden insgesamt).
1.8986 Sekunden zum Aktualisieren der Anzahl. (7,6822 Sekunden insgesamt).
0,0641 Sekunden, um 832 Windex-Datensätze hinzuzufügen. (7.7464 s insgesamt).
17,2725 Sekunden zum Hinzufügen eines Index von 3435 PID / Wid-Paaren. (25.7752 s insgesamt).
Die Operation dauerte 26,07 Sekunden, um 500 Produkte zu indexieren.

Die 3435 Paare werden alle in einer einzigen Abfrage ausgeführt, wie zum Beispiel:

%Vor%

Warum ist InnoDB in meinem Fall so viel langsamer als MyISAM?

    
nick 02.02.2012, 14:39
quelle

2 Antworten

14

InnoDB bietet eine komplexere Schlüsselstruktur als MyIsam ( FOREIGN KEYS ) und das Regenerieren von Schlüsseln ist in InnoDB sehr langsam. Sie sollten alle update / insert-Anweisungen in eine Transaktion einschließen (die sind eigentlich ziemlich schnell in InnoDB, wenn ich etwa 300 000 Insert-Abfragen auf InnoDb-Tabelle mit 2 Indizes hatte und es etwa 30 Minuten dauerte, sobald ich alle 10 000 Einfügungen in BEGIN TRANSACTION und COMMIT es dauerte weniger als 2 Minuten).

Ich empfehle zu verwenden:

%Vor%

Dies wird dazu führen, dass InnoDB die Indizes nur einmal, nicht ein paar hundert Mal aktualisiert.

Lass es mich wissen, wenn es funktioniert

    
Vyktor 02.02.2012, 14:48
quelle
4

Ich hatte ein ähnliches Problem und InnoDB scheint standardmäßig innodb_flush_log_at_trx_commit aktiviert zu haben, was jede insert / update-Abfrage in Ihrer hdd-Protokolldatei löscht. Die Schreibgeschwindigkeit Ihrer Festplatte ist ein Engpass für diesen Prozess.

Versuchen Sie also, Ihre mysql-Konfigurationsdatei zu ändern

%Vor%

Starten Sie den mysql-Dienst neu.

Ich habe über x100 Beschleunigung auf Inserts erfahren.

    
Mini Fridge 11.08.2015 09:50
quelle

Tags und Links