Gibt es irgendwelche Probleme / Dinge, die Sie wissen müssen, wenn Sie von MyISAM zu InnoDB wechseln?

8

Eines meiner Projekte verwendet die MyISAM-Engine in MySQL, aber ich überlege, sie in InnoDB umzuwandeln, da ich hier und da Transaktionsunterstützung benötige.

  • Was sollte ich mir ansehen oder überlegen, bevor ich das mache?
  • Kann ich einfach den Motor wechseln oder sollten die Daten darauf vorbereitet sein?
Jrgns 22.10.2008, 10:24
quelle

6 Antworten

8

Ja absolut, es gibt viele Dinge, Sie sollten Ihre Anwendung sehr gründlich testen:

  • Transaktionen können sich blockieren und müssen wiederholt werden. Dies ist (unter Umständen) auch bei einer autocommitted-Transaktion der Fall, die nur eine Zeile einfügt.
  • Die Disc-Nutzung wird mit ziemlicher Sicherheit zunehmen
  • E / A-Auslastung während Schreibvorgängen wird mit hoher Wahrscheinlichkeit
  • erhöhen
  • Das Verhalten der Indexierung wird sich ändern, da InnoDB Clustered-Indizes verwendet - dies kann in einigen Fällen ein nützlicher Effekt sein.
  • Ihre Sicherungsstrategie wird beeinträchtigt. Beachten Sie dies sorgfältig.

Der Migrationsprozess selbst muss sorgfältig geplant werden, da es sehr lange dauern wird, wenn Sie viele Daten haben (während dieser Zeit sind die Daten entweder schreibgeschützt oder gar nicht verfügbar - überprüfen Sie das!)

    
MarkR 22.10.2008, 10:31
quelle
7

Es gibt einen großen Vorbehalt. Wenn Sie während eines Schreibvorgangs Hardwarefehler (oder Ähnliches) bekommen, wird InnoDB Tabellen korrumpieren.

MyISAM wird auch, aber ein mysqlcheck - Auto-Reparatur wird sie reparieren. Dies mit InnoDB-Tabellen zu versuchen schlägt fehl. Ja, das ist aus Erfahrung.

Dies bedeutet, dass Sie einen guten regelmäßigen Datensicherungsplan für die Verwendung von InnoDB benötigen.

    
Jeff Davis 26.06.2009 16:04
quelle
5

Einige andere Anmerkungen:

InnoDB verteilt keinen freien Speicherplatz im Dateisystem, nachdem Sie eine Tabelle / Datenbank gelöscht oder einen Datensatz gelöscht haben. Dies kann durch "Dumping und Importieren" oder durch Festlegen von innodb_file_per_table=1 in my.cnf gelöst werden.

Das Hinzufügen / Entfernen von Indizes in einer großen InnoDB-Tabelle kann ziemlich schmerzhaft sein, da es die aktuelle Tabelle sperrt, eine temporäre mit Ihren geänderten Indizes erstellt und Daten - Zeile für Zeile - einfügt. Es gibt ein Plugin von Innobase , aber es funktioniert nur für MySQL 5.1

InnoDB ist auch VIEL MEHR speicherintensiv, ich schlage vor, dass Sie eine so große innodb_buffer_pool_size Variable haben, wie Ihr Server-Speicher erlaubt (70-80% sollte eine sichere Wette sein). Wenn Ihr Server UNIX / Linux ist, sollten Sie die sysctl-Variable vm.swappiness auf 0 reduzieren und innodb_flush_method=O_DIRECT verwenden, um eine doppelte Pufferung zu vermeiden. Testen Sie immer, wenn Sie swap drücken, wenn Sie diese Werte wechseln. Weitere Informationen finden Sie im Blog von Percona , das ist großartig.

Sie können auch mysqlbackup mit --single-transaction --skip-lock-tables ausführen und haben keine Tabellensperren, während die Sicherung beginnt.

In jedem Fall ist InnoDB großartig, lassen Sie sich von einigen Fallstricken nicht entmutigen.

    
Laurynas Pečiūra 23.10.2008 08:28
quelle
3

Nur die Tabelle zu ändern und den Motor einzustellen, sollte in Ordnung sein.

  • Einer der großen, auf den man achten sollte, ist, dass select count(*) from MyTable in InnoDB langsamer ist als MyISAM
  • auto_increment-Werte werden nach einem Serverneustart auf den höchsten Wert in der Tabelle +1 zurückgesetzt - dies kann komische Probleme verursachen, wenn Sie eine unordentliche Datenbank mit einigen Löschvorgängen haben.
  • Die optimalen Servereinstellungen unterscheiden sich von denen einer MyISAM db.
  • Stellen Sie sicher, dass die Größe der innodb-Datei groß genug ist, um alle Ihre Daten zu speichern, oder Sie werden durch ständige Neuzuweisung gekreuzt, wenn Sie die Engines der Tabellen ändern.
J.D. Fitz.Gerald 22.10.2008 15:55
quelle
1

Wenn Sie beabsichtigen, InnoDB als Möglichkeit zum Abrufen von gleichzeitigen Abfragen zu verwenden, sollten Sie innodb_file_trx_commit=1 so einstellen, dass Sie etwas Leistung zurückbekommen. OTOH, wenn Sie Ihre Anwendung so umstellen möchten, dass sie transaktionsbewusst ist, dann ist die Entscheidung für diese Einstellung Teil der allgemeinen Leistungsüberprüfung, die für die InnoDB-Einstellungen erforderlich ist.

Die andere wichtige Sache, auf die Sie achten sollten, ist, dass InnoDB weder FullText-Indizes noch INSERT DELAYED unterstützt. Aber dann unterstützt MyISAM referentielle Integrität nicht. : -)

Sie können jedoch nur die Tabellen durchlaufen, für die Sie eine Transaktion benötigen. Ich habe das getan. Kleine Tabellen (bis zu mehreren tausend Zeilen) können übrigens oft spontan geändert werden.

    
staticsan 28.10.2008 05:53
quelle
0

Die Leistungsmerkmale können unterschiedlich sein, daher müssen Sie möglicherweise die Last im Auge behalten.

Die Daten sind in Ordnung.

    
Greg 22.10.2008 10:26
quelle