Cache MySQL-Datenbank im Speicher


11

Ich habe Probleme mit einer Website mit 600 MB MySQL-Datenbank. Die Website ist viel zu langsam. Mir ist aufgefallen, dass die MySQL-Datenbank umso langsamer wird, je größer sie wird. Als es 5 MB war, war die Website sehr schnell. Als es größer wurde, wurde es immer langsamer und jetzt, bei 600 MB, ist es sehr langsam und es dauert ungefähr 10 Sekunden, um Seiten zu laden.

Ich habe die Top-Prozesse überprüft und es hat nichts mit hoher Last oder irgendetwas zu tun. Es hat nicht einmal mit IOPS zu tun, da ich es auf Festplatten mit 7,2 k U / min getestet habe, und es gab jetzt das gleiche Problem beim Testen mit Intel 320 SSD-Laufwerken, daher denke ich auch nicht, dass es sich um hohe Abfragen handelt.

Die Website verwendet Wordpress und es sind ungefähr 9 Plugins aktiv. Die Leute sagten, es könnten die Plugins sein ... na ja, vielleicht ... aber im Moment möchte ich nur die gesamte Datenbank im Speicher zwischenspeichern und möchte Hilfe und Anweisungen dazu erhalten, wo ich anfangen soll und wie es geht.

Ich habe 16 GB RAM und i5-2400 4 Kerne bei 3,1 GHz. OS ist Centos 5.7

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached

Antworten:


10

Wenn ich Sie wäre, würde ich alle Daten auf InnoDB umstellen. Das Sperren von Tabellen / Zeilen wird von vielen schon lange diskutiert. Ich würde InnoDB immer zweifellos wählen. Es gibt jedoch noch einen weiteren wichtigen Grund, sich für InnoDB zu entscheiden ... CACHING .

Während die meisten Leute damit prahlen, dass MyISAM schneller zum Lesen ist, vergessen die meisten Leute, dass der viele Cache für MyISAM, der als Schlüsselcache bezeichnet wird (festgelegt durch key_buffer_size), nur Indexseiten aus .MYI-Dateien zwischenspeichert. Es werden niemals Datenseiten zwischengespeichert. Es hat ein offizielles Maximum von 4 GB in 32-Bit-Systemen. 8 GB sind das beste Maximum für 64-Bit.

Der InnoDB-Pufferpool speichert die Daten- und Indexseiten zwischen. Abhängig von Ihrem Server können Sie bis zu dem gesamten Datensatz im RAM zwischenspeichern. Sie können InnoDB für bis zu 80% RAM und 10% für DB Conenctions optimieren und 10% für das Betriebssystem belassen. Dies gilt auch für verschiedene Betriebssysteme .

Ich habe diese Dinge Drupal-Kunden mit erstaunlichem Erfolg empfohlen . Dies gilt auch für Wordpress . Ich habe DB-Unterstützung für Clients mit WordPress bereitgestellt. Gleiche Verbesserungen.

Sie können den Speicher für InnoDB immer effektiver konfigurieren als für MyISAM. Es gibt immer eine Möglichkeit, InnoDB zu tweeken, um Ihren Leistungsanforderungen zu entsprechen . Wenn Ihre Daten wachsen, werden sie schließlich zu einer Anforderung .

UPDATE 2011-11-21 11:44 EST

Wenn Ihr vollständiger Datensatz klein genug ist, können Sie direkt nach dem Start von mysql eine SELECT-Abfrage für jede Tabelle ausführen.

Führen Sie für alle Tabellen, die InnoDB und / oder MyISAM sind, diese Abfrage aus:

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',
    db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
    SELECT
        engine,table_schema db,table_name tb,index_name,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
    FROM (
        SELECT
            B.engine,A.table_schema,A.table_name,
            A.index_name,A.column_name,A.seq_in_index
        FROM
            information_schema.statistics A INNER JOIN
            (SELECT engine,table_schema,table_name
            FROM information_schema.tables
            WHERE engine IN ('InnoDB','MyISAM')) B
            USING (table_schema,table_name)
        WHERE
            B.table_schema NOT IN ('information_schema','mysql')
            AND A.index_type <> 'FULLTEXT'
        ORDER BY
            table_schema,table_name,index_name,seq_in_index
        ) A
    GROUP BY
        table_schema,table_name,index_name
) AA
ORDER BY
    engine DESC,db,tb
;

Dadurch wird jede mögliche SELECT-Abfrage ausgegeben, die Sie ausführen müssen, um alle zu referenzierenden Indizes aufzurufen. Platzieren Sie diese Abfrage in einer Datei mit dem Namen /root/MakeSelectQueriesToLoad.sql. Führen Sie das Skript aus und sammeln Sie die Ausgabe /root/SelectQueriesToLoad.sql. Führen Sie es schließlich aus:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

Dadurch werden definitiv alle Indexseiten in den InnoDB-Pufferpool und den MyISAM-Schlüsselcache vorgeladen. Wenn alle Ihre Daten InnoDB sind, nehmen Sie zwei Änderungen vor:

  • ersetzen WHERE engine IN ('InnoDB','MyISAM')durchWHERE engine='InnoDB'
  • ersetzen CONCAT('SELECT ',ndxcollist,' FROM ',durchCONCAT('SELECT * FROM ',

Dadurch werden auch mehr Datenseiten in den InnoDB-Pufferpool eingefügt.

SCHLUSSBEMERKUNG: Stellen Sie sicher, dass der InnoDB-Pufferpool groß genug ist, um alle Ihre InnoDB-Daten aufzunehmen


2

Sie speichern bereits die gesamte Datenbank im Speicher. Das Problem ist mit ziemlicher Sicherheit die Zeit, die zum Durchsuchen der Datenbank benötigt wird, selbst im RAM.

Beobachten Sie Ihre Festplatten-E / A-Statistiken. Sie werden wahrscheinlich sehen, dass es nur gelegentlich zufällige Festplatten-E / A gibt. Die Datenbank befindet sich im Speicher. Das ist nicht das Problem. Sie müssen iostatzuerst installieren . Sie erwähnen Ihre Plattform oder Distribution nicht, aber sie befindet sich wahrscheinlich in einem Paket namens iostat. Sie können atopfreundlicher finden.

Haben die Leute, die Ihnen das gesagt haben, dies getan, nachdem sie Beweise dafür erhalten haben, dass sich Ihre gesamte Datenbank nicht bereits im Speicher befindet oder dass die Festplatten-E / A das Problem war? Ansonsten entspricht ihr Rat einem Arzt, der Sie noch nie gesehen oder untersucht hat, aber nur gehört hat, dass Ihr Arm verletzt ist und Sie aufgefordert hat, einen Gipsverband darauf zu legen.


-1

Installieren Sie ein gutes Caching-Plugin für Wordpress, es könnte helfen. Aber früher oder später müssen Sie den Engpass herausfinden, der Ihr System verlangsamt.

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.