Ich habe einfache db mit 4 Tabellen mit jeweils einigen Millionen Zeilen und mehreren Indizes. Ich führe mehrere hundert Updates und Inserts pro Minute durch. Die Lesevorgänge sind viel seltener, aber sie müssen schnell sein - für eine Web-App. Die Lesevorgänge sollten Vorrang haben - ich kann die Schreibvorgänge verzögern, wenn dies dazu beiträgt, das Schnippeln beim Lesen zu verbessern.Wie sollte MySQL für viele Schreibvorgänge und wenige Lesevorgänge (100: 1) optimiert/abgestimmt werden. Read perfe reqd
Derzeit, wenn ich nicht Inserts und Updates schreibe, wählt die alle gut mit. Wenn ich gleichzeitig schreibe, können sich die Dinge verlangsamen - manchmal massiv. Der Server wird definitiv IO-gebunden - ich habe Iostat verwendet und die Disk-Unitlization zu 99% während hoher Schreibzeiten gesehen.
Morgen werde ich versuchen, einen oder zwei Indizes zu schneiden, die Zeilengröße zu verkleinern und den Abfragecache zu deaktivieren. Hat jemand andere Vorschläge, wie die Tabelle oder MySQL selbst für viele Schreibvorgänge und wenige Lesevorgänge abgestimmt werden sollte?
Die Tabellen sind derzeit so eingerichtet, dass sie die innodb-Engine mit kompakten Zeilen verwenden, und der größte Teil der Konfiguration ist weiterhin auf den Standardwert eingestellt, abgesehen von der Pufferpoolgröße. Die db wird weiterhin schnell wachsen, also ist es keine Option, alles in Ram zu sitzen.
Update: Es ist auf slicehost.com - 1gb ram, Razzia 10.
Scheint mir ziemlich sinnlos. Alle Server müssen immer noch die gleiche Schreiblast verarbeiten. Wenn Lesevorgänge nicht häufig ausgeführt werden, ist es unwahrscheinlich, dass die Replikation hilft. –
Danke für die Antwort auf diesen Emil. Ich möchte sinnlose Gansjagden vermeiden, wenn ich kann. Du hast mir vielleicht einige Stunden erspart. Stimmt jemand dem Vorschlag von Jitter zu? –