Einführung von Methoden zur Optimierung von MYSQL unter verschiedenen Gesichtspunkten, um Leistung zu erzielen. Die Optimierung ist eine komplexe Aufgabe, da sie letztendlich ein Verständnis des gesamten Systems erfordert. Während es möglich ist, eine lokale Optimierung mit wenig Wissen über Ihr System/Ihre Anwendung durchzuführen, müssen Sie dies wissen, je mehr Sie Ihr System optimieren möchten Daher wird in diesem Kapitel versucht, verschiedene Möglichkeiten zur Optimierung von MySQL zu erläutern und zu geben. Denken Sie jedoch daran, dass es immer noch bestimmte (immer schwieriger werdende) Möglichkeiten gibt, die für das System schneller sind Der wichtigste Teil, um Ihr System schneller zu machen, ist natürlich das grundlegende Design. Sie müssen auch wissen, dass Ihr System solche Dinge tun wird, und das ist Ihr Engpass.
Die Zeit, die eine Festplatte benötigt, um ein Datenelement zu finden, betrug im Jahr 1999 normalerweise weniger als 10 ms, sodass wir theoretisch etwa 1000 Mal pro Sekunde suchen konnten Festplatten und ist schwer zu messen. Die Möglichkeit, die Daten auf mehrere Festplatten zu verteilen, besteht darin, dass sich die Festplatten an der richtigen Stelle befinden, an der wir die Daten lesen müssen. Eine Festplattenübertragung beträgt etwa 10–20 Mbit/s. Dies muss einfacher zu optimieren sein, da Sie in parallelen CPU-Zyklen von mehreren Festplatten lesen können. Wenn wir Daten in den Speicher einlesen (oder wenn sie bereits vorhanden sind), müssen wir sie verarbeiten, um dies zu erreichen Unsere Ergebnisse: Dies ist der häufigste limitierende Faktor, wenn wir Tabellen mit relativ kleinem Speicher haben, aber bei kleinen Tabellen ist die Cache-Bandbreite normalerweise kein Problem, wenn die CPU mehr Daten benötigt, als hineinpassen im CPU-Cache. Dies ist auf den meisten Systemen ein ungewöhnlicher Engpass, aber Sie sollten sich dessen bewusst sein. 10.2 System-/Kompilierungszeit und Boot-Parameter-Optimierung Wir beginnen mit den Dingen auf Systemebene, da einige dieser Entscheidungen sehr früh getroffen werden. In anderen Fällen reicht möglicherweise ein kurzer Blick auf diesen Abschnitt aus, da er für den großen Gewinn nicht ausschlaggebend ist. Es ist jedoch immer gut, ein Gefühl dafür zu haben, wie groß der Gewinn auf dieser Ebene ist. Für die maximale Nutzung ist es wichtig Wenn Sie bis zu einem gewissen Grad mehrere CPUs verwenden, sollten Sie Solaris (da Threads wirklich gut funktionieren) oder Linux verwenden (da der 2.2-Kern wirklich gute SMP-Unterstützung bietet). Und auf 32-Bit-Rechnern hat Linux standardmäßig eine Dateigrößenbeschränkung von 2G. . Hoffentlich wird dies bald behoben, wenn das neue Dateisystem (XFS) veröffentlicht wird. Da wir MySQL nicht auf vielen Plattformen ausführen, empfehlen wir Ihnen, die Plattform, die Sie darauf ausführen möchten, zu testen.
Weitere Vorschläge:
Wenn Sie über genügend RAM verfügen, können Sie in einigen Fällen alle Swap-Geräte entfernen, auch wenn Sie über freien Speicher verfügen. Beachten Sie, dass dies keine Auswirkungen hat MySQL-Funktionalität, solange es nur auf einem Server läuft. Denken Sie daran, den Server zu stoppen (oder die relevanten Teile zu sperren), bevor Sie myisamchk ausführen. Auf einigen Systemen ist dieser Schalter obligatorisch, da die externe Sperre nicht in allen Fällen verfügbar ist Beim Kompilieren mit MIT-pthreads ist die Option --skip-locking standardmäßig auf on (on) eingestellt, da flock() nicht auf allen Plattformen vollständig unterstützt wird. Der einzige Fall ist, wenn Sie den MySQL-Server ausführen (nicht). Wenn Sie den Client auf dieselben Daten anwenden, können Sie --skip-locking nicht verwenden. Andernfalls führen Sie myisamchk für die Tabelle aus, ohne zuvor den mysqld-Server zu leeren oder zu sperren. Sie können weiterhin LOCK TABLES/UNLOCK TABLES verwenden, auch wenn Sie --skip verwenden -Verriegelung.
Wie sich Kompilierung und Verknüpfung auf die MySQL-Geschwindigkeit auswirken
Die meisten der folgenden Tests wurden unter Linux und mit dem MySQL-Benchmark durchgeführt, sie sollten jedoch Hinweise auf andere Betriebssysteme und Workloads geben. Sie erhalten die schnellsten ausführbaren Dateien, wenn Sie eine Verbindung mit -static statt mit TCP herstellen /IP bietet möglicherweise auch eine bessere Leistung, wenn Sie mit pgcc und -O6 kompilieren. Um „sql_yacc.cc“ mit diesen Optionen zu kompilieren, sind etwa 200 MB Speicher erforderlich, da gcc/pgcc viel benötigt Speicher, um alle Funktionen inline zu machen, sollten Sie auch CXX=gcc festlegen, um die Einbindung der libstdc++-Bibliothek zu vermeiden (dies ist nicht erforderlich, indem Sie einen besseren Compiler oder bessere Compileroptionen verwenden, Sie können eine 10 erhalten). -30 % Beschleunigung in Ihrer Anwendung. Dies ist besonders wichtig, wenn Sie den SQL-Server selbst kompilieren. Sie sollten z. B. pgcc oder den Cygnus CodeFusion-Compiler verwenden. Wir haben den neuen Fujitsu-Compiler getestet fehlerfrei genug, um die Kompilierung von MySQL zu optimieren.
Hier sind einige von uns erstellte Maßblätter:
Wenn Sie pgcc mit -O6 verwenden und etwas kompilieren, ist der mysqld-Server 11 % schneller als mit gcc (mit der String-99-Version). Wenn Sie dynamisch verknüpfen (ohne -static), ist das Ergebnis 13 % langsamer Kann immer noch eine dynamisch verknüpfte MySQL-Bibliothek verwenden. Wenn Sie TCP/IP anstelle von Unix-Sockets verwenden, ist das Ergebnis 7,5 % langsamer als Sun Pro C++ 4.2 ist 13 % schneller als Solaris mit nativen Threads auf einem einzelnen Prozessor. Mit freundlicher Genehmigung von TcX. Die Linux-Distribution wird mit pgcc kompiliert und statisch verknüpft.
Wie bereits erwähnt, stellt die Festplattensuche einen großen Leistungsengpass dar. Dieses Problem wird immer deutlicher, wenn die Datenmenge zunimmt, sodass das Caching unmöglich wird. Bei großen Datenbanken, bei denen Sie mehr oder weniger zufällig auf die Daten zugreifen müssen, ist dies möglich Verlassen Sie sich darauf, dass Sie mindestens einen Datenträger zum Lesen und mehrere Datenträger zum Schreiben benötigen. Um dieses Problem zu minimieren, verwenden Sie Datenträger mit kurzen Suchzeiten, um die Anzahl der verfügbaren Datenträgerspindeln zu erhöhen (und dadurch den Suchaufwand zu reduzieren). Es ist möglich, Dateien mit verschiedenen Festplatten zu verknüpfen oder die Festplatte zu teilen. Dies bedeutet, dass Sie die Index-/Datendateien symbolisch mit der anderen Festplatte verknüpfen (die auch geteilt werden kann). Mal besser (wenn die Festplatte nicht für andere Zwecke verwendet wird). Aufteilung bedeutet, dass Sie viele Festplatten haben und den ersten Block auf einer Festplatte platzieren , und der n-te Block befindet sich auf der (n mod number_of_disks)-ten Festplatte usw. Das bedeutet, dass Sie eine etwas bessere Leistung erhalten, wenn Ihre normale Datengröße kleiner als die Split-Größe ist (oder perfekt (entsprechend angeordnet) ist. Beachten Sie die Aufteilung ist stark vom Betriebssystem und der Split-Größe abhängig. Siehe 10.8. Beachten Sie, dass die Aufteilung stark vom Betriebssystem und der Split-Größe abhängt Bei den Parametern und der Anzahl der Festplatten können Sie Größenordnungsunterschiede erzielen. Beachten Sie, dass Sie sich für die Optimierung für zufälligen oder sequentiellen Zugriff entscheiden müssen. Aus Gründen der Zuverlässigkeit möchten Sie möglicherweise RAID 0+1 (Split + Mirror) verwenden In diesem Fall benötigen Sie 2*N Laufwerke, um die Daten von N Laufwerken zu speichern. Wenn Sie das Geld haben, müssen Sie möglicherweise auch in eine Volume-Management-Software investieren Eine gute Option besteht darin, die weniger wichtigen Daten (die reproduziert werden können) auf einer RAID 0-Festplatte zu speichern und die wirklich wichtigen Daten (wie Hostinformationen und Protokolldateien) auf einer RAID 0+ 1- oder RAID N-Festplatte zu speichern Aufgrund der Aktualisierung der Paritätsbits kann RAID N ein Problem darstellen. Sie können auch Parameter für das von der Datenbank verwendete Dateisystem festlegen. Eine einfache Änderung besteht darin, das Dateisystem mit der Option „noatime“ bereitzustellen der Inode, dessen Aktualisierung übersprungen wird, wodurch einige Suchvorgänge auf der Festplatte vermieden werden.
Sie können Tabellen und Datenbanken aus dem Datenbankverzeichnis an einen anderen Speicherort verschieben und durch Symbole ersetzen, die auf den neuen Speicherort verweisen. Dies kann beispielsweise durch Verschieben einer Datenbank in ein Dateisystem erfolgen, das über mehr freien Speicherplatz verfügt MySQL stellt fest, dass eine Tabelle ein symbolischer Link ist, der den symbolischen Link auflöst und die Tabelle verwendet, auf die er tatsächlich verweist. Er funktioniert auf allen Systemen, die den Aufruf realpath() unterstützen (zumindest Linux und Solaris unterstützen realpath()). die realpath() nicht unterstützen. Auf Ihrem System sollten Sie nicht gleichzeitig über einen realen Pfad und einen symbolischen Link auf die Tabelle zugreifen. Andernfalls ist die Tabelle nach Aktualisierungen inkonsistent Standardmäßig funktioniert alles einwandfrei, solange Sie keine symbolische Verknüpfung zwischen Datenbanken herstellen. Gehen Sie davon aus, dass Sie eine Datenbank db1 im MySQL-Datenverzeichnis haben und eine symbolische Verknüpfung db2 erstellen, die auf db1 verweist.
Shell&> cd /path/to/datadir
Shell&> ln -s db1 db2
Nun gibt es für jede Tabelle tbl_a in db1 auch eine Tabelle tbl_a in db2. Wenn ein Thread db1.tbl_a aktualisiert und ein anderer Thread db2.tbl_a aktualisiert, wird es Probleme geben „mysys/mf_format.c“ muss geändert werden:
if (!lstat(to,&stat_buff)) /* Prüfe, ob es sich um einen symbolischen Link handelt */
if (S_ISLNK(stat_buff.st_mode) && realpath(to,buff))
Ändern Sie den Code wie folgt:
if (realpath(to,buff))