Wir haben vor einiger Zeit besprochen, wie InnoDB für hohe Leistung konfiguriert wird, aber wir haben noch nicht besprochen, wie wir die MySQL-Leistung verbessern können, während wir erweiterte InnoDB-Einstellungen verwenden. Dieser Blogbeitrag soll etwas mehr Einblick in dieses Thema geben.
InnoDB erklärt
Bevor wir tatsächlich tiefer in die InnoDB-Einstellungen eintauchen, sollten wir wahrscheinlich die Grundlagen verstehen:InnoDB ist eine Speicher-Engine für MySQL, MariaDB und Percona Server. Die Engine war als InnoDB-Plugin bekannt, was die Einrichtung und Installation des Plugins erfordert. Bis zur Veröffentlichung von MySQL 5.5.5 ist InnoDB kein Plugin mehr und gehört nun als eine der unterstützten Speicher-Engines für MySQL zum MySQL-Paket. Seit der Veröffentlichung von MySQL 5.6 ist InnoDB die Standard-Speicher-Engine geworden – es ist eine Allzweck-Speicher-Engine, die hohe Zuverlässigkeit und hohe Leistung in Einklang bringt. Zu den Hauptvorteilen von InnoDB gehören die Unterstützung von Sperren auf Zeilenebene, Fremdschlüssel und die Einhaltung des ACID-Modells (Atomicity Consistency Isolation Durability) – ACID ist eine Reihe von Eigenschaften, die die Datengültigkeit trotz Fehlern, Stromausfällen und anderen Problemen gewährleisten sollen. InnoDB verfügt über eine umfangreiche Liste von Variablen, von denen einige zur Verbesserung der Leistung beitragen, insbesondere in Bezug auf die Art der Hardware und die verfügbaren Ressourcen Ihres Datenbankservers. Darunter sind:
- innodb_data_file_path ist die Datei, in der Daten aus InnoDB-Tabellen gespeichert werden.
- innodb_buffer_pool_size ist ein Speicherpuffer, den InnoDB verwendet, um Daten und Indizes seiner Tabellen zwischenzuspeichern.
- innodb_log_file_size zeigt die Größe von InnoDB-Protokolldateien. Je größer die innodb_log_file_size ist, desto länger ist die Wiederherstellungszeit, die Sie im Falle eines Absturzes benötigen.
- innodb_log_buffer_size wird von InnoDB verwendet, um in die Protokolldateien auf der Festplatte zu schreiben.
- innodb_flush_log_at_trx_commit steuert das Gleichgewicht zwischen Leistung und ACID-Compliance. Der Standardwert ist 1, was dazu beiträgt, InnoDB ACID-konform zu bleiben - wenn Sie innodb_flush_log_at_trx_commit auf 2 setzen, erhalten Sie eine sehr schnelle Schreibgeschwindigkeit, aber Transaktionen im Wert von bis zu einer Sekunde können verloren gehen.
Es gibt auch erweiterte InnoDB-Einstellungen, die eingestellt werden können, um die MySQL-Leistung noch weiter zu verbessern. Wir werden sie uns jetzt ansehen.
Erweiterte InnoDB-Einstellungen
Wie bereits oben erwähnt, verfügt InnoDB über erweiterte Einstellungen, die verwendet werden können, um die Leistung weiter zu verbessern (wir werden nicht absolut alle auflisten, aber die aufgelisteten Einstellungen sollten Ihnen eine ziemlich gute Vorstellung davon, wie leistungsfähig InnoDB wirklich ist):
- InnoDB kann deaktiviert werden – wenn Sie InnoDB deaktivieren möchten, ändern Sie einfach die Datei my.cnf und fügen Sie skip-innodb im Abschnitt [mysqld] hinzu. Starten Sie danach Ihren MySQL-Server neu - InnoDB sollte jetzt deaktiviert sein. Alternativ können Sie die Option --innodb verwenden:Wenn Sie sie auf OFF setzen, wird die Engine deaktiviert. Beachten Sie jedoch, dass diese Optionen ab MySQL 5.7.5 veraltet sind.
- InnoDB bietet auch einen konfigurierbaren Sperrmechanismus, der die Leistung von SQL-Anweisungen verbessern kann, die Zeilen zu Tabellen mit AUTO_INCREMENT-Spalten hinzufügen:Auto-Increment-Modi können beim Start mit der Option innodb_autoinc_lock_mode konfiguriert werden. Die Option hat drei Einstellungen zum Festlegen des Sperrmodus – der Sperrmodus kann 0 („traditionell“), 1 („konsekutiv“) oder 2 („interleaved“) sein. Die Werte bieten Leistung je nach Typ der Datenbankeinfügung. Kurz gesagt, 0 bietet Kompatibilität mit älteren Versionen von MySQL und Innodb. Der Wert 1 bietet mehr Sicherheit und einen deterministischen Ansatz für die anweisungsbasierte Replikation (SBR). Während der Wert 2 den skalierbareren und schnellsten Sperrmodus hat, können Zeilen, die durch eine bestimmte Anweisung eingefügt werden, möglicherweise nicht aufeinanderfolgend sein. Weitere Informationen finden Sie in der MySQL-Dokumentation.
- InnoDB gibt Ihnen die Möglichkeit, den Pufferpool in mehrere Segmente zu unterteilen (die Funktion ist erst ab MySQL 5.5 verfügbar) – die Einstellung innodb_buffer_pool_instances ermöglicht es Ihnen, die Skalierbarkeit von MySQL auf Maschinen zu verbessern, die mehrere Kerne ausführen. Standardmäßig ist der Wert dieser Einstellung 1, wenn die innodb_buffer_pool_size kleiner als 1 GB ist, andernfalls 8:Die Zahl gibt die Anzahl der Regionen an, in die der InnoDB-Pufferpool unterteilt ist. Diese Einstellung kann verwendet werden, um mehr Kerne zu aktivieren, wir werden später erklären, wie.
- InnoDB bietet vier Transaktionsisolationsstufen (tx_isolation in <5.7, aber transaction_isolation in Version 5.7 und höher):READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ und SERIALIZABLE:Diese Isolationsstufen sind das „I“ im ACID-Akronym :
- Wenn READ UNCOMMITTED verwendet wird, sieht eine Transaktion möglicherweise nicht festgeschriebene Änderungen durch eine andere Transaktion. Diese Isolationsstufe erlaubt Dirty Reads.
- Wenn READ COMMITTED verwendet wird, können Sie sicher sein, dass alle gelesenen Daten zum Zeitpunkt des Lesens festgeschrieben wurden.
- Wenn REPEATABLE READ verwendet wird, wird eine höhere Isolationsstufe verwendet. Zusätzlich zu allem, was durch das READ COMMITTED-Level garantiert wird, garantiert es auch, dass sich bereits gelesene Daten nicht ändern können.
- Wenn SERIALIZABLE verwendet wird, wird eine noch höhere Isolationsstufe verwendet. Zusätzlich zu allem, was durch die REPEATABLE READ-Isolationsstufe garantiert wird, garantiert sie auch, dass keine neuen Daten durch nachfolgende Lesevorgänge gesehen werden können.
- Mit InnoDB können Sie auch die für InnoDB verfügbare I/O-Gesamtkapazität definieren, indem Sie die Variable innodb_io_capacity ändern. Der Wert dieser Variable sollte ungefähr auf die Anzahl der IOPS eingestellt werden, die das System pro Sekunde ausführen kann:Beachten Sie beim Festlegen des Werts dieses Parameters, dass Werte um 100 für HDDs besser geeignet sind, während SSDs von höheren Werten profitieren könnten . Die Variable innodb_io_capacity_max kann ebenfalls hilfreich sein:Diese Variable ermöglicht es InnoDB, aggressiver zu spülen, was bedeutet, dass die Rate der I/O-Operationen die durch innodb_io_capacity definierte Grenze überschreiten könnte – in solchen Situationen überschreiten Operationen nicht den durch die Variable innodb_io_capacity_max definierten Wert .
- Mit InnoDB können Sie auch steuern, wie viele Hintergrund-Threads für I/O-Operationen verfügbar sind:Die Anzahl der I/O-Threads, die Leseoperationen zugewiesen sind, kann durch die Variable innodb_read_io_threads gesteuert werden, während die Anzahl der I/O-Threads gesteuert werden kann. O-Threads, die Schreibvorgängen zugeordnet sind, können durch die Variable innodb_write_io_threads gesteuert werden. Der Standardwert für diese beiden Parameter ist 4 und der maximal zulässige Wert ist 64.
- InnoDB hat die Fähigkeit, bestimmte InnoDB-Warnungen in Fehler umzuwandeln:Setzen Sie dazu einfach die Variable innodb_strict_mode auf ON:Diese Variable beeinflusst die Behandlung von Syntaxfehlern für CREATE TABLE-, ALTER TABLE- und CREATE INDEX-Operationen :Durch Deaktivieren dieser Variable können Fehler „Zeilengröße zu groß“ behoben werden. Um den strikten Modus zu deaktivieren, setzen Sie innodb_strict_mode auf OFF.
- InnoDB kann etwas gegen Full Table Scans geschützt werden, die die im Pufferpool zwischengespeicherten Daten beeinträchtigen, indem die Variable innodb_old_blocks_time erhöht wird. Der Mindestwert für diese Einstellung ist 0, der Standardwert ist 1000.
- Wenn Sie Wartungsvorgänge an InnoDB-Tabellen ausführen, die FULLTEXT-Indizes enthalten, ziehen Sie in Betracht, die Variable innodb_optimize_fulltext_only auf ON zu setzen – nachdem diese Variable aktiviert wurde, sollte die OPTIMIZE TABLE-Abfrage schneller ausgeführt werden, da sie die Reorganisation von Daten überspringt in der Tabelle. Beachten Sie, dass diese Einstellung nur vorübergehend aktiviert werden soll, sodass Sie sie möglicherweise deaktivieren möchten, sobald die Optimierung abgeschlossen ist.
- Um InnoDB im schreibgeschützten Modus zu starten, aktivieren Sie die Einstellung innodb_read_only. Wenn diese Einstellung aktiviert ist, können Sie InnoDB-Tabellen abfragen, in denen sich das MySQL-Datenverzeichnis auf schreibgeschützten Medien befindet.
InnoDB dazu bringen, mehr Kerne zu aktivieren
Sie können InnoDB auch dazu bringen, mehr Kerne zu beschäftigen, indem Sie seine Multithreading-Fähigkeiten nutzen:Überraschenderweise ist dies nicht sehr schwer zu erreichen - Sie müssen nur ein paar Einstellungen ändern. So geht's:
- Lassen Sie die innodb_thread_concurrency-Option auf ihrem Standardwert 0. Dadurch überlassen Sie InnoDB die Entscheidung, die beste Anzahl an Concurrency-Tickets (sie bestimmen die Anzahl an Threads, die gleichzeitig in InnoDB eintreten können) für ein bestimmtes MySQL zu öffnen Instanz einrichten. Für MariaDB ab 10.5 ist es als veraltet gekennzeichnet, daher wäre es für MySQL sinnvoll, dies auf 0 zu setzen, da die Rechenressourcen im Vergleich zu den frühen Tagen von MySQL hochentwickelt waren.
- Sobald die Option innodb_thread_concurrency auf 0 gesetzt ist, setzen Sie sowohl innodb_read_io_threads als auch innodb_write_io_threads auf ihre Maximalwerte von 64. Dadurch sollten mehr Kerne beansprucht werden.
Zusammenfassung
Zusammenfassend lässt sich sagen, dass InnoDB eine extrem leistungsstarke Speicher-Engine ist. Die Leistung dieser Speicher-Engine wird direkt von den Einstellungen beeinflusst, die diese Engine verwendet. Wenn Sie also die Leistung Ihrer MySQL-Instanz verbessern möchten, sollten Sie mindestens einige der in diesem Artikel erwähnten Tipps beachten. Wenn Sie die Einstellungen bezüglich der Engine optimieren und gegebenenfalls verwenden, sollten Sie einen Vorteil haben.