MyISAM ist eine der beliebtesten Speicher-Engines in MySQL. MyISAM ist häufig die zweite Wahl nach InnoDB - in diesem Blogbeitrag werden wir versuchen herauszufinden, wie man am besten mit dieser Engine arbeitet.
Was ist MyISAM?
MyISAM ist eine der Speicher-Engines von MySQL. MyISAM basiert auf ISAM (Indexed Sequential Access Method), einem von IBM entwickelten Indizierungsalgorithmus, der das schnelle Abrufen von Informationen aus großen Datenmengen ermöglicht. Aufgrund seiner Tabellensperre funktioniert es jedoch nicht sehr gut, wenn gleichzeitig von einer Tabelle gelesen und in diese geschrieben wird. Es unterstützt auch keine Transaktionen.
Für einige MySQL-Ingenieure ist diese Engine die beliebteste Wahl nach InnoDB:Die MyISAM-Speicher-Engine war die einzige von MySQL im Jahr 2005 bereitgestellte Speicher-Engine und stand für mehr als 20 Jahre zur Verfügung. MyISAM war die Standardspeicher-Engine für MySQL bis Version 5.5.
MyISAM von innen
Eine Veranschaulichung, wie MyISAM von innen funktioniert, liegt nicht im Rahmen dieses Blogs, aber wir können Ihnen die Einstellungen zur Verfügung stellen, die Ihnen helfen, die Leistung der Engine zu optimieren:
- Myisam_sort_buffer_size definiert den Puffer, der zugewiesen wird, wenn der Index sortiert wird, indem REPAIR-, CREATE INDEX- oder ALTER TABLE-Abfragen ausgeführt werden.
- Key_buffer_size definiert die Größe des Puffers, der für Indexblöcke über MyISAM-Tabellen hinweg verwendet wird. Eine Erhöhung dieses Parameters kann zu einer besseren Handhabung des Index führen.
- Sort_buffer_size beschreibt die Größe eines Puffers, der Threads zugewiesen wird, die Sortieroperationen durchführen müssen.
- Read_buffer_size beschreibt die Größe eines Puffers, der Threads zugewiesen wird, die sequentielle Scanvorgänge durchführen.
- Write_buffer_size beschreibt die Größe des Schreibpuffers.
Diese vier Parameter sind wichtig, aber obwohl sie wichtig sind, sollten Sie auch die Variable key_buffer_size im Auge behalten. Die Variable key_buffer_size bestimmt die Größe der im Speicher gehaltenen Indexpuffer – stellen Sie sie sich als das Gegenstück zu innodb_buffer_pool_size vor, jedoch für MyISAM. Wenn Ihre Server hauptsächlich aus MyISAM-Tabellen bestehen, könnten Sie etwa 25 % oder mehr des verfügbaren RAM auf dem Server der Variable key_buffer_size zuweisen. Es gibt auch eine andere Möglichkeit, den Wert des Parameters key_buffer_size zu bestimmen – vergleichen Sie einfach den Wert key_read_requests (Gesamtwert der Anfragen zum Lesen eines Index) und den Wert key_reads (der Wert von key_reads ist die Anzahl der Anfragen, die sein mussten von Datenträger lesen). Die Werte für diese Parameter können abgerufen werden, indem Sie sich die Serverstatusvariablen ansehen (geben Sie einfach eine SHOW GLOBAL STATUS-Abfrage auf Ihrem MySQL-Server aus). Es ist auch von Vorteil, daran zu denken, dass der Wert von key_buffer_size wahrscheinlich zu klein ist, wenn key_reads einen großen Wert zurückgibt.
MyISAM und MySQL 8.0
Wenn Sie einige MySQL-Ingenieure fragen, werden sie sagen, dass MyISAM nicht mehr verwendet werden sollte. Wieso den? Nun, einige Leute sagen das aufgrund der Tatsache, dass sie, als MySQL weiterentwickelt wurde, die Mehrheit der Funktionen, die zuvor nur in MyISAM zu sehen waren, zu InnoDB hinzugefügt haben, was MyISAM effektiv überflüssig macht:
- Volltextindizes sind in InnoDB seit Version 5.6 verfügbar.
- Portable Tablespaces sind seit Version 5.6 in InnoDB verfügbar.
- Räumliche Indizes sind seit Version 5.7 in InnoDB verfügbar.
- Das letzte Update für die Tabelle wurde in InnoDB seit Version 5.7 verfügbar.
Sollten Sie also trotzdem MyISAM verwenden? Wahrscheinlich nicht. Es gibt jedoch einen Vorbehalt - denken Sie daran, dass einfache COUNT(*)-Abfragen auf MyISAM wahrscheinlich schneller ausgeführt werden als auf InnoDB - MyISAM speichert die Zahl in den Tabellenmetadaten, InnoDB nicht.
Ich verwende MyISAM und möchte zu InnoDB wechseln, was kann ich tun?
Wenn Sie immer noch MyISAM verwenden und zu InnoDB wechseln möchten, konvertieren Sie einfach alle Ihre Tabellen zu InnoDB. Das ist natürlich leichter gesagt als getan, aber hier ist eine einfache Anleitung:
- Finden Sie heraus, welche Tabellen in Ihrer MySQL-Instanz MyISAM verwenden:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘database_name’ AND ENGINE = ‘MyISAM’;
- Konvertieren Sie alle Ihre MyISAM-Tabellen in InnoDB:
ALTER TABLE `table_name` ENGINE = InnoDB;
Wenn Sie nicht mehrere ALTER TABLE-Anweisungen nacheinander ausführen möchten, sollten Sie die ALTER TABLE-Anweisungen in eine Schleife versetzen. Das war's – fertig!
Zusammenfassung
MyISAM ist eine der beliebtesten MySQL-Engines. Die Engine war die Standardeinstellung für MySQL-Versionen bis 5.5. Die Engine ist nach InnoDB eine der beliebtesten Optionen, kann aber ab MySQL 8.0 als obsolet bezeichnet werden - MySQL hat bereits dafür gesorgt, dass alles, was mit MyISAM möglich ist, auch bei Verwendung von InnoDB möglich ist, also an dieser Stelle MyISAM ist praktisch nur nützlich, wenn Sie möchten, dass einfache COUNT(*)-Abfragen schneller sind. Solche Abfragen werden schneller sein, da MyISAM die Nummer in Tabellen-Metadaten speichert – andere MySQL-Engines nicht.