MySQL High Performance für viele SELECTs / INSERTs / UPDATEs / DELETEs


9

Ich erstelle ein Modul, in dem jeder Benutzer häufig 10 bis 300 Sekunden lang einen Datensatz in eine Tabelle erhält.

Nach Ablauf der Zeit wird ein Datensatz gelöscht. Der Fall ist: Es wird viele Benutzer geben und Datensätze werden sich sehr oft ändern - wie wirkt sich dies auf die Leistung der Anwendung für diese Tabelle aus, da sich Datensätze sehr oft ändern und ich mich frage, ob MySQL damit einverstanden ist? Wie Indizes kommen und gehen, ändern sich Daten für diese bestimmte Tabelle wie 200 Mal / Sekunde. Vielleicht wähle ich eine schlechte Lösung für diese Art von Arbeit. Irgendwelche Vorschläge ?

Danke!


2
Haben Sie versucht, Daten im Memcache zu speichern und sie dann alle paar Sekunden in einer Transaktion zu löschen?

3
"Datenänderungen wie 200 Mal / Sekunde für diese bestimmte Tabelle" Ich denke, dass die Zeile, in der diese Daten angegeben sind, im Speicher gehalten werden sollte. Die Lebensdauer, für die sie bestehen müssen, ist winzig, sollte sie also wahrscheinlich nicht auf die Festplatte übertragen werden.

Indizes kommen und gehen? Ich kann mir keinen Grund vorstellen, warum Sie sehr oft Indizes erstellen und löschen müssten.
Barry Brown

Antworten:


3

Eine Sache, die berücksichtigt werden muss, ist, wie MySQL Puffer für seine wichtigsten Speicher-Engines verwendet: InnoDB und MyISAM .

Was im Speicher zwischengespeichert liegt, unterscheidet sich stark zwischen diesen Speicher-Engines.

InnoDB speichert sowohl Daten- als auch Indexseiten zwischen. Sie werden in den InnoDB- Pufferpool geladen, dessen Größe nach innodb_buffer_pool_size bemessen ist .

MyISAM speichert nur Indexseiten zwischen und sie werden in den Schlüsselcache (Schlüsselpuffer) geladen, der die Größe von key_buffer_size hat .

Sie müssen information_schema.tables verwenden , um die auf der Festplatte belegten Daten- und Indexgrößen abzurufen, damit der InnoDB-Pufferpool und der MyISAM-Schlüsselcache korrekt dimensioniert werden können .

Abhängig davon, wie viele Daten Sie haben und wie viel Zeit Sie einplanen, können Sie die Caches wie folgt erwärmen:

Für jede Tabelle TableT

  • gehe zu jedem Index NDX
  • für jeden Index NDX
    • Führen Sie SELECT für jede Spalte in NDX aus, wobei mindestens eine Spalte in TableT von TableT nicht indiziert ist

Auf diese Weise stellen Sie sicher, dass jede Daten- und Indexseite mindestens einmal gelesen wird. Sie werden im Cache sitzen. Dieses Konzept wird teilweise und im Prinzip von Percona praktiziert . Percona baute dieses Konzept in mk-Slave-Prefetch ein . Was dieses Programm macht, ist

  • Lesen Sie die Relay-Protokolle auf einem Slave, bevor der Slave das darin enthaltene SQL verarbeitet
  • Nehmen Sie eine SQL-Anweisung aus dem Relay-Protokoll und konvertieren Sie sie in eine SELECT-Anweisung, wobei Sie die Klauseln WHERE, GROUP BY und ORDER BY als Leitfaden für die Auswahl von Indizes verwenden
  • Führen Sie die SELECT-Anweisung aus, die aus konvertiertem SQL stammt

Dies zwingt den Slave dazu, 99,99% der Daten zu haben, die der Slave benötigt, um die SQL schnell zu verarbeiten. Dies macht den Slave auch für den Fall vorbereitet, dass Sie manuell ein Failover auf den Slave durchführen und ihn zu einem Master hochstufen, dessen Caches genau so sind wie der Master, von dem Sie versagt haben.

FAZIT

Es gibt nichts Schöneres, als Caches bereit, bereit und in der Lage zu haben, sie in einer Umgebung mit schweren INSERTS, UPDATEs und DELETEs zu verwenden.

Versuche es !!!

VORBEHALT

Mit der Geburt von Produkten wie memcached haben sich einige von der Notwendigkeit gelöst, MySQL ordnungsgemäß zu optimieren. Zugegeben, viele Websites profitieren von der Verbesserung des Datenabrufs durch die Steuerung des Caching-Verhaltens von Daten, wie Entwickler mit memcached schnell festgestellt haben. Viele andere Websites haben die gleichen Leistungsvorteile erzielt, indem sie lediglich die Speicher-Engines gewechselt oder MySQL korrekt konfiguriert haben. Machen Sie das Beste aus Ihrer Datenbank, bevor Sie die Datenbank aufgeben und sie ausschließlich als Repository verwenden. Befolgen Sie die Due Diligence und Sie werden angenehm überrascht sein, was MySQL für Sie tun wird.


5

Ob das eine schlechte Lösung ist, hängt von vielen Dingen ab. Müssen diese Daten persistent sein? Andernfalls funktioniert möglicherweise eine Lösung, die diese Daten einfach im Speicher hält, besser.

"Viele Benutzer" helfen niemandem wirklich. MySQL wird höchstwahrscheinlich in Ordnung sein, wenn "viel" ein paar Hundert bedeuten würde. (Abhängig davon, was Ihre Datenbank sonst noch zu tun hat. Mehrere Tausend sollten höchstwahrscheinlich auch funktionieren.)

Schließlich spielt es keine Rolle, ob Sie diese Datensätze schreiben, um sie nach einigen Sekunden bis Minuten beizubehalten oder zu löschen. Durch das Löschen werden nur zwei Operationen aus einer. Und MySQL kann mit Sicherheit sehr viel erstellen und löschen. Stellen Sie sicher, dass Sie einen einfachen Index verwenden, um diese Datensätze zum Löschen wieder zu finden.

Ohne tatsächliche Zahlen und einige Informationen über die von Ihrem Datenbankserver verwendete Hardware kann dies jedoch nicht mit großer Genauigkeit beantwortet werden.

Am besten schreiben Sie eine kleine Anwendung, die einfach die Menge an Last simuliert, von der Sie glauben, dass Sie sie erhalten, ohne viel echte Verarbeitung durchzuführen. Legen Sie einfach viele Datensätze auf den Server, löschen Sie sie und führen Sie mit der gleichen Geschwindigkeit einige Abfragen wie die aus Rest Ihres Programms würde generieren. Schauen Sie sich Ihren Server an und prüfen Sie, ob dies Auswirkungen auf ihn hat.

Ich bin mir nicht sicher, aber es gibt Optionen für MySQL, mit denen eine Tabelle im Speicher vollständig zwischengespeichert werden kann. Dies geschieht ohnehin in vielen Situationen, und höchstwahrscheinlich müssen Sie nicht viel ändern. Wenn Sie jedoch über eine wirklich sehr große Anzahl von Benutzern und Datensätzen sprechen, können Sie möglicherweise einige Parameter anpassen, um das Caching für Ihre speziellen Anforderungen zu optimieren.


4
+1 für den Vorschlag einer Lösung, die die Daten im Speicher hält.

3

Hier ist eine verrückte Idee. Es beinhaltet Annahmen und nicht immer empfohlene Vorgehensweisen (wie das Aktualisieren eines Schlüssels) - ich werde viele Negative bekommen, wenn ich dies vorschlage, aber hier ist es ...

Angenommen, Sie haben ein sehr hohes Zeilen- und Löschvolumen, können Sie die Löschleistung verbessern, indem Sie zwei Partitionen in Ihrer Tabelle erstellen. Die Partitionen würden sich durch die erste Ziffer des Schlüssels unterscheiden. Beispiel:

Der Schlüsselwert 1123234441 gilt für aktive Zeilen und der Schlüsselwert: 9123234441 für inaktive Zeilen (die erste Ziffer in diesem Beispiel wird wie folgt verwendet: 1 = aktiv, 9 = inaktiv).

Wenn der Benutzer eine Zeile löscht, löschen Sie die Zeile nicht physisch, sondern aktualisieren den Schlüssel (Autsch!). Dadurch wird die Zeile automatisch in die inaktive Zeilenpartition verschoben.

Natürlich müssen Sie Ihre Auswahl einschränken, um nur Daten von der aktiven Partition zu lesen. Der coole Teil ist nun, dass das Löschen der inaktiven Zeilenpartition extrem schnell ist.

Wie ich bereits sagte, funktioniert dies, wenn Sie nur 1 Tabelle haben. Ich habe dies nicht getestet, es ist also nur ein theoretischer Ansatz, aber ich habe die Geschwindigkeit des Ablegens von Partitionen erlebt und es ist erstaunlich schnell.

Verwenden Sie zur Verbesserung Ihrer Auswahl die richtige Indizierung und zur Verbesserung der Einfügungen, um die Zeilengröße und die Anzahl der Indizes zu minimieren (diese Anweisung ist sehr allgemein gehalten ...)

Eine Referenz finden Sie unter: http://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html Ich hoffe, dies hilft.


2
Ich bin mir nicht sicher, ob dies für dieses spezielle Problem sinnvoll ist (ich vermute immer noch, dass MySQL das Ganze zwischenspeichert und diese Datensätze höchstwahrscheinlich nie eine Festplatte sehen werden). Aber +1 für den Hinweis auf eine interessante Optimierungstechnik, die ich bisher nicht kannte.
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.