Welche Konfigurationsoptionen für MySQL bieten die größten Geschwindigkeitsverbesserungen?


29

Welche Konfigurationsoptionen für MySQL bieten die größten Geschwindigkeitsverbesserungen?

Ich frage mich, ob die Konfigurationsdatei tatsächlich verbessert wurde, welche Tabellentypen, Hardware-Setups, Replikationen usw. verwendet wurden. Außer der Abfragestruktur und der Tabellenstruktur (diese sind auf der Website und bei Stack Overflow leicht zu finden). Sind Dinge wie Cache-Einstellungen für Abfragen die Geschwindigkeit, die Sie am meisten beschleunigt haben? Wie wäre es mit Laufwerken; ist es besser, es auf einem externen oder internen RAID zu haben? Hat die Replikation zu einer besseren Leistung geführt, insbesondere bei großen Leseabfragen?

Welche anderen Einstellungen / Änderungen haben Sie vorgenommen, um die Leistung von MySQL zu verbessern?

Hinweis: Mir ist klar, dass diese sehr nutzungsabhängig sind (dh kleine Website vs. Data Warehouse), aber da ich denke, dass die meisten von uns wahrscheinlich an einer Vielzahl von Standorten / Systemen arbeiten, ist es gut, eine Vielzahl von Techniken zu kennen, die auf verschiedene angewendet werden können Situationen. Ich denke auch, dass einige Techniken zwischen Situationen übertragen werden können.


Nicht ganz verwandt, aber Sie sollten InnoDB als Master verwenden. Sie können auf MyISAM-Slaves replizieren und die integrierte Volltextsuche verwenden, mit der die Textsuche viel schneller als mit LIKE
Neil McGuigan,

Antworten:


20

Hier sind meine Empfehlungen (Ihre Millage kann variieren)

  • Verwenden Sie Hardware-RAID. Dies widerspricht meinen Empfehlungen zur Verwendung von Software-RAID in anderen Posts. Dies ist jedoch eine bestimmte Situation, in der Sie die Hardware-RAID-Karte benötigen. Insbesondere soll der batteriegepufferte NVRAM auf der RAID-Karte die Zeit reduzieren, die erforderlich ist, um die Protokolldatei mit fsync auf die Festplatte zu übertragen.
  • Verwenden Sie NUR RAID 1- oder RAID 10-Volumes. Die Kosten für RAID 5 oder 6-Schreibvorgänge sind zu hoch, um sie bei einer gemischten Lese- / Schreiblast zu tolerieren.
  • Verwenden Sie separate LUNs für die Daten-, Protokoll- und TMP-Volumes. Diese sollten alle vom Betriebssystem und den Swap-Volumes getrennt sein.
  • Verwenden Sie InnoDB .
  • Verwenden Sie innodb_file_per_table
  • Verwenden Sie ein 64-Bit-Betriebssystem
  • Stellen Sie Ihren InnoDB-Pufferpool auf ~ 80% des verfügbaren RAM ein
  • Stellen Sie Ihre Protokolldateien auf 1/4 Ihrer Pufferpoolgröße ein, Sie zwischen 2 bis 4 Protokolldateien. Größere Protokolldateien bedeuten langsamere Herunterfahren- und Wiederherstellungszeiten, ermöglichen es Ihnen jedoch, große Datenbankabbilder schneller wiederherzustellen.
  • log_slow_queries, log-queries-not-using-indexes, set-variable = long_query_time = 1, untersuchen Sie jede Abfrage in diesem Protokoll und überarbeiten Sie Ihr Schema, um Tabellenscans und tmp-Tabellen nach Möglichkeit zu vermeiden.

11

Wieder einmal hat Dave Cheney es hier wirklich aus dem Park geworfen. Ich kann seiner Antwort auf Ihre Frage wirklich nichts hinzufügen. Ich möchte jedoch darauf hinweisen, was Sie nicht gefragt haben. Wie Jeremy Zawodny und Peter Zaitsev mir vor Jahren beigebracht haben, wird Ihr ROI für das Aufspüren und Optimieren fehlerhafter Abfragen Ihren ROI für das zehnfache Durchführen von Konfigurationsänderungen übertreffen. Sicher, Sie möchten keine schlechte Konfiguration, kein falsches RAID-Setup oder nicht genügend RAM. Aber unter exzellenten und sogar marginalen MySQL-DBAs sind schlechte Abfragen (normalerweise von Entwicklern / Frameworks, nicht vom DBA) ein chronischer Zustand, bei dem eine schlechte Konfiguration erträglich ist .

(Ich habe eine Weile nach diesen Adjektiven gesucht und bin immer noch nicht zufrieden mit denen, die ich ausgewählt habe.)

Ich möchte noch einmal betonen, dass Sie, wenn Ihre Entwickler ein ORM verwenden, wie es in Frameworks wie Ruby on Rails und Django üblich ist, die Abfragen, die Ihre Datenbank betreffen, WIRKLICH überwachen MÜSSEN. Wenn Entwickler aufhören, an SQL zu denken und die Datenbank abstrahieren lassen, ist das ein echt fieses Problem. Ich liebe die beiden Frameworks, die ich gerade erwähnt habe. (Stimmen Sie mich nicht dafür ab, dass ich sie schlecht ausgesprochen habe.) Das macht Query Sleuthing nur sehr wichtig. (Lesen Sie: Arbeitsplatzsicherheit)


4

Einige andere Dinge (die in Dave Cheneys Antwort nicht erwähnt wurden)

  • Setzen Sie innodb_flush_method auf O_DIRECT, um eine doppelte Datenpufferung zu vermeiden. Vermeiden Sie dies, wenn Ihre RAID-Karte keinen batteriegepufferten Schreibcache hat oder sich Ihre Daten in einem SAN befinden.

  • Spielen Sie auch mit der innodb_thread_concurrency. Ich glaube, die Standardeinstellung ist 8, aber es lohnt sich, dies zu optimieren, um zu sehen, ob es die Leistung verbessert

  • Stellen Sie sicher, dass der Abfrage-Cache aktiviert ist, und überprüfen Sie die Statistiken, um die Trefferquote zu ermitteln. Wenn es gut ist, versuchen Sie es zu erhöhen, um zu sehen, ob es die Trefferquote verbessert.

  • Abhängig von den ausgeführten Anwendungen können Sie möglicherweise die Standardisolationsstufe ändern. Der Standardwert ist REPEATABLE_READ, aber READ_COMMITTED bietet möglicherweise eine bessere Leistung

  • Wenn es sich bei Ihren Anweisungen hauptsächlich um UPDATEs und DELETEs handelt, können Sie versuchen, den Cache auf dem Slave mit einer SELECT-Abfrage vorzubereiten, die die zu ändernde Ergebnismenge zurückgibt. Schauen Sie sich das mk-slave-Prefetch- Tool an, das dies für Sie erledigt

  • Schauen Sie sich neben MyISAM und InnoDB auch andere Speicher-Engines an



1

Als erstes sollten Sie sich die Speicherparameter ansehen. Die Standardeinstellungen für MySQL sind sehr, sehr konservativ. Unabhängig davon, welche Engine Sie verwenden, müssen Sie wahrscheinlich die Anzahl der Speicherparameter um das Zehn- oder sogar Hundertfache erhöhen.

Als nächstes sollten Sie sich den Tabellencache ansehen. Der Standardwert ist 64, was nur nützlich ist, wenn Sie nicht mehr als etwa 60 Tabellen haben. Sie werden das sehr weit bringen wollen.

Als Drittes sollten Sie sich den Thread und die Verbindungsparameter ansehen. Der Standardwert für wait_timeout ist für die meisten webbasierten Anwendungen sehr lang und kann auf 30 Sekunden reduziert werden. Dies wird auch die Speichernutzung verbessern, da MySQL schneller Verbindungen aufbaut und viel weniger im Ruhezustand herumliegt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.