Ich habe den DB-Leistungsengpass erreicht, wo jetzt?

8

Ich habe einige Abfragen, die zu lange dauern (300 ms), jetzt da die Datenbank auf einige Millionen Datensätze angewachsen ist. Glücklicherweise müssen die Abfragen nicht den Großteil dieser Daten betrachten, die letzten 100.000 Datensätze reichen aus, daher ist geplant, eine separate Tabelle mit den neuesten 100.000 Datensätzen zu führen und die Abfragen dagegen auszuführen. Wenn jemand Vorschläge für eine bessere Vorgehensweise hat, wäre das großartig. Meine eigentliche Frage ist, welche Möglichkeiten es gibt, wenn die Abfragen gegen die historischen Daten laufen müssten, was ist der nächste Schritt? Dinge, an die ich gedacht habe:

  • Hardware aktualisieren
  • Verwenden Sie eine In-Memory-Datenbank
  • Speichern Sie die Objekte manuell in Ihrer eigenen Datenstruktur

Sind diese Dinge richtig und gibt es andere Möglichkeiten? Haben einige DB-Anbieter mehr Funktionalität als andere, um mit diesen Problemen umzugehen, z.B. Spezifizieren einer bestimmten Tabelle / eines bestimmten Index, um vollständig im Speicher zu sein?

Tut mir leid, ich hätte das erwähnen sollen, ich benutze mysql.

Ich habe vergessen, Indexierung oben zu erwähnen. Die Indexierung war bisher meine einzige Verbesserung, um ganz ehrlich zu sein. Um Engpässe zu identifizieren, habe ich maatkit für die Abfragen verwendet, um zu zeigen, ob Indizes verwendet werden oder nicht.

Ich verstehe, dass ich jetzt davon komme, wofür die Frage eigentlich gedacht ist, vielleicht sollte ich eine andere machen. Mein Problem ist, dass EXPLAIN sagt, dass die Abfrage 10ms anstatt 300ms dauert, was jprofiler meldet. Wenn jemand irgendwelche Vorschläge hat, würde ich es wirklich schätzen. Die Abfrage lautet:

%Vor%

und die Ausgabe von EXPLAIN ist:

%Vor%     
James 28.07.2011, 14:32
quelle

7 Antworten

1

Eine solche Designänderung ist kein gutes Zeichen - ich wette, Sie haben immer noch eine Menge Leistung, die Sie mit EXPLAIN herauspressen können, indem Sie db-Variablen anpassen und die Indizes und Abfragen verbessern. Aber Sie sind wahrscheinlich an dem Punkt vorbei, an dem "Probedruck" sehr gut funktioniert. Es ist eine Gelegenheit zu lernen, wie man die Analysen und Logs interpretiert und was Sie für spezifische Verbesserungen von Indizes und Abfragen verwenden.

Wenn Ihr Vorschlag gut war, sollten Sie uns schon sagen können, warum. Und beachte, dass dies eine beliebte Pessimisierung ist -

Was ist die lächerlichste Pessimierung, die Sie haben gesehen?

    
dkretz 28.07.2011, 17:25
quelle
3
  1. Stellen Sie sicher, dass alle Ihre Indizes optimiert sind. Verwenden Sie explain für die Abfrage, um festzustellen, ob Ihre Indizes effizient verwendet werden.
  2. Wenn Sie einige schwere Joins machen, denken Sie darüber nach, diese Berechnung in Java durchzuführen.
  3. Denken Sie daran, andere DBs wie NoSQL zu verwenden. Sie können vielleicht eine Vorverarbeitung durchführen und Daten in Memcache speichern, um Ihnen ein wenig zu helfen.
Amir Raminfar 28.07.2011 14:37
quelle
1

Nun, wenn Sie die Datenbank und Abfragen optimiert haben, würde ich sagen, dass, anstatt die Daten zu zerhacken, der nächste Schritt ist:

a) die mysql-Konfiguration und stellen Sie sicher, dass es das Beste aus der Hardware macht

b) schauen Sie sich die Hardware an. Sie sagen nicht, welche Hardware Sie verwenden. Sie können feststellen, dass Replikation in Ihrem Fall eine Option ist, wenn Sie zwei oder drei Server kaufen können, um die Lesevorgänge von der Datenbank aufzuteilen (Schreibvorgänge müssen auf einem zentralen Server ausgeführt werden, Lesevorgänge können jedoch von beliebig vielen Slaves gelesen werden) .

    
Jaydee 28.07.2011 14:47
quelle
1

Anstatt eine separate Tabelle für die neuesten Ergebnisse zu erstellen, sollten Sie über die Tabellenpartitionierung nachdenken. MySQL hat diese Funktion seit Version 5.1 eingebaut.

Nur um es klarzustellen: Ich sage nicht, dass dies die Lösung für Ihre Probleme ist. Nur eine Sache können Sie versuchen

    
Mchl 28.07.2011 17:44
quelle
0

Ich würde zunächst versuchen, die Tabellen / Indizes / Abfragen zu optimieren, bevor Sie eine der aufgeführten Maßnahmen ergreifen. Haben Sie sich mit den schlecht funktionierenden Abfragen so weit beschäftigt, dass Sie absolut davon überzeugt sind, dass Sie das Limit der Fähigkeiten Ihres RDBMS erreicht haben?

Bearbeiten: Wenn Sie tatsächlich richtig optimiert sind, aber immer noch Probleme haben, sollten Sie eine Materialized View für die genauen Daten erstellen, die Sie benötigen. Das mag eine gute Idee sein oder auch nicht, die auf mehr Faktoren basiert, als Sie angegeben haben, aber ich würde es an die Spitze der Liste von Dingen setzen, die es zu berücksichtigen gilt.

    
Phil Sandler 28.07.2011 14:37
quelle
0

Das Suchen in den letzten 100.000 Datensätzen sollte furchtbar schnell sein, Sie haben definitiv Probleme mit den Indizes. Verwenden Sie EXPLAIN und beheben Sie es.

    
Karoly Horvath 28.07.2011 14:43
quelle
0

Ich verstehe, dass ich jetzt davon komme, wofür die Frage gedacht war     also sollte ich vielleicht noch eins machen. Mein Problem ist, dass EXPLAIN sagt     Die Abfrage dauert 10ms statt 300ms, die jprofiler meldet.

Dann muss dein Problem (und deine Lösung) in Java sein, oder?

    
dkretz 28.07.2011 17:44
quelle