2009-06-14 32 views
2

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.

Antwort

0

Ich schlage vor, Sie schreiben/lesen Spaltung durch eine MySQL-Master-Slave-Konfiguration einrichten.

Sie schreiben in den Master und leiten die Lesevorgänge an die Slaves um.

Die Aufspaltung selbst kann auf zwei Arten

  1. Verwenden Sie einen Proxy (MySQL Proxy, Continuent/Sequoia, ..)
  2. Sie die Aufspaltung sich in Ihrer Anwendung
+0

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. –

+0

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? –

1

Indizes erfolgen werden die Schreibvorgänge verlangsamen, sind aber für die Leseleistung notwendig, so wenig wie möglich, um die Lesevorgänge zu unterstützen. Wird Ihr clustered index eine Menge Verlangsamung verursachen?

Eine weitere Möglichkeit besteht darin, aus Ihren Schreibvorgängen eine separate Datenbank/Tabelle zu lesen und sich für eine Konsistenz zu entscheiden - das ist in Ihrem Fall nicht möglich.

+0

Wie würde ein gruppierter Index Verlangsamungen verursachen? Es ist ein großer int, also fügen Sie den sekundären Indizes eine minimale Länge hinzu. Ich hätte etwas dagegen, wenn die meisten neuen Schreibvorgänge nur in 3-Minuten-Chunks oder ähnlichem verfügbar wären - die meisten davon müssen nicht sofort verfügbar sein. –

+0

Entschuldigung - ich sagte "Ich hätte etwas dagegen" oben. Ich meinte, ich hätte nichts dagegen. –

+0

Ein gruppierter Index würde Verlangsamungen verursachen, wenn er aufgrund der Reihenfolge der Anzeigen mehr Schreibvorgänge verursacht. Wenn es sich um einen autoinkrementierenden Big-Int handelt, sollten Sie dort kein Problem sehen. –

1

Eine Sache (von vielen) zu berücksichtigen ist die Verwendung von Transaktionen. Wenn Sie mehrere Schreibvorgänge unter einer Transaktion bündeln können, sollte die Anzahl der Festplattenzugriffe verringert werden.

+0

kann ich noch nicht upvote, sonst würde ich. Danke für den Vorschlag. Es hat einige interessante Google-Ergebnisse gebracht, die aussehen, als würden sie helfen. (Einschließlich http://dev.mysql.com/doc/refman/5.1/en/innodb-tuning.html) –

0

Wenn MySQL einen Index Fill Factor unterstützt, wäre das ein Bereich, den man sich ansehen sollte. Leider unterstützt Version 5 den Füllfaktor nicht (anscheinend befindet er sich in der Liste feature request für Version 6.x).

  • Das Entfernen von nicht verwendeten Indizes und das Einschränken der Breite Ihrer Indizes würde helfen.

  • Untersuchen Sie, wie viel Speicher der Server hat.

  • Ist die Festplatte RAID?

  • +0

    Der Server hat 1 GB Speicher, und ist auf Raid 10. Ich werde nicht in der Lage sein zu erhöhen Speicher für die db - die db wird es weiterhin wachsen. Gibt es ein Minimum, auf das ich achten sollte? Welche Rolle spielt RAID? –

    +0

    RAID wird auch Schreibvorgänge verlangsamen und Lesevorgänge verbessern. –

    +0

    @Cade Roux: nicht unbedingt –

    1

    Leider ist MySQL normalerweise für ein Lese-/Schreibverhältnis von 80/20 ausgelegt Ich weiß nicht, ob es viel zu tun gibt.

    Verwenden Sie Transaktionen?

    Wenn die von Ihnen ausgewählten Daten nicht oft vom Schreiben betroffen sind (so dass die Änderung zum Zeitpunkt des Schreibens bei einer Änderung die Schreibleistung nicht beeinflusst), können Sie sie zum Zeitpunkt des Schreibens externalisieren, z. am Ende der Transaktion.

    +0

    Ich bin noch nicht mit Transaktionen auf die mehrere Schreibvorgänge, aber ich werde sie morgen in Transaktionen Batch, um zu sehen, ob das hilft. Ich werde auch auf die Erhöhung der Protokollgröße und Protokollpuffer nach http://dev.mysql.com/doc/refman/5.1/en/innodb-tuning.html –

    +0

    Okay, bitte geben Sie uns später Feedback. –

    1

    Ich denke, Sie müssen Partitionierung in Betracht ziehen. Es ist so ziemlich die einzige Möglichkeit, Schreibvorgänge zu skalieren. MySQL hat native support dafür von 5.1 und höher, aber es ist auch durchaus möglich, Ihre eigene Lösung zu rollen. Letzteres ist viel komplizierter, daher würde ich, wenn möglich, die integrierte Unterstützung empfehlen. In Anbetracht Ihrer übermäßigen Schreiblast ist dies jedoch möglicherweise nicht ausreichend. Es ist schwierig, Ihnen detailliertere Ratschläge zu geben, ohne zu wissen, wie die Daten strukturiert sind.

    +0

    Wow - Ich hatte ein total falsches Verständnis darüber, was Partitionierung war, also habe ich mich nicht einmal darum gekümmert, bis jetzt darüber zu lesen. Klingt gut - werde es morgen ausprobieren. Danke für den Vorschlag. –

    +0

    Sie können auch nach "sharding" suchen. Es ist fast dasselbe wie Partitionierung, betont aber, dass es sich um eine benutzerdefinierte Lösung handelt. Ich denke, dass Sie auf diese Weise zusätzliche Ressourcen finden können. –

    Verwandte Themen