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.
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:
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:
und die Ausgabe von EXPLAIN
ist:
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?
explain
für die Abfrage, um festzustellen, ob Ihre Indizes effizient verwendet werden. 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) .
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
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.
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.
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?
Tags und Links mysql database caching database-design database-performance