it-swarm.com.de

Cache MySQL-Datenbank im Speicher

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 erhalten, wo ich anfangen soll und wie es geht.

Ich habe 16 GB RAM und i5-2400 4 Kerne bei 3,1 GHz. Das Betriebssystem 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
11
grant tailor

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. Jedoch es gibt noch einen weiteren wichtigen Grund, sich für InnoDB ... CACHING zu entscheiden .

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 auf bis zu 80% RAM und 10% für DB Conenctions) einstellen und 10% für das Betriebssystem belassen. Dies gilt auch für verschiedene Betriebssysteme .

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

Sie können jederzeit Speicher für InnoDB konfigurieren effektiver als Sie MyISAM können. Es gibt immer einen Weg zu tweek InnoDB, um Ihren Leistungsanforderungen zu entsprechen . Wenn Ihre Daten wachsen, werden sie schließlich eine 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 Sie WHERE engine IN ('InnoDB','MyISAM') durch WHERE engine='InnoDB'
  • ersetzen Sie CONCAT('SELECT ',ndxcollist,' FROM ', durch CONCAT('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

10
RolandoMySQLDBA

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 feststellen, dass es nur gelegentlich zufällige Festplatten-E/A gibt. Die Datenbank ist im Speicher. Das ist nicht das Problem. Sie müssen zuerst iostat installieren. Sie erwähnen Ihre Plattform oder Distribution nicht, aber sie befindet sich wahrscheinlich in einem Paket namens iostat. Möglicherweise finden Sie atop freundlicher.

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.

2
David Schwartz