Hier ist die Situation:
Ich muss zuerst eine Abfrage ausführen, um zu wissen, wie viele Datensätze existieren.
Zum Beispiel: SELECT COUNT(DISTINCT userid) from users;
Oft ist das alles, was benötigt wird. Manchmal (etwa 30% der Zeit) nach der ersten Abfrage möchte der Benutzer jedoch eine zweite Abfrage ausführen, in der die Datensätze aufgeführt sind.
Zum Beispiel: SELECT * FROM users;
Gibt es einen Grund, SELECT COUNT
zu starten und nicht nur SELECT
? Das heißt, macht das Zählen von Datensätzen in SQL schneller als das tatsächliche Zurückziehen der Datensätze? Oder macht es im Wesentlichen die gleiche Arbeit, und deshalb sollte ich zwei Abfragen vermeiden?
Mit anderen Worten, ist es besser, die Datensätze immer nur in der ersten Abfrage zu ziehen (nicht COUNT
), dann die Datensätze im Code (Java) zu zählen. Wenn der Benutzer die zweite Abfrage ausführen möchte, dann habe ich schon die Daten. Wenn nicht, dann lösche es einfach.
Was ist die beste Vorgehensweise hier?
Wenn Sie wissen, dass Sie die Daten benötigen, gehen Sie vor und ziehen Sie sie in den Code. Wenn Sie jedoch nur die Anzahl benötigen, ist es wesentlich schneller, die Anzahl aus der Datenbank abzurufen, als tatsächlich Zeilen abzurufen. Außerdem ist es üblich, nur das zu ziehen, was Sie brauchen.
Wenn Sie beispielsweise alle Zeilen in einer Tabelle zählen, müssen die meisten Datenbankimplementierungen keine Zeilen anzeigen. Tabellen wissen, wie viele Zeilen sie haben. Wenn die Abfrage Filter in der where
-Klausel enthält und einen Index verwenden kann, muss sie sich nicht erneut die Daten der tatsächlichen Zeilen ansehen, sondern zählt nur die Zeilen aus dem Index.
Und das alles zählt nicht die weniger übertragenen Daten.
Eine Faustregel über Datenbankgeschwindigkeiten ist, gehen Sie voran und probieren Sie es selbst aus. Allgemeine Regeln sind nicht immer ein guter Indikator. Zum Beispiel, wenn die Tabelle 10 Zeilen und nur ein paar Spalten hätte, würde ich das ganze Ding sowieso auf die Chance ziehen, die ich brauchte, da 2 Runden zur Datenbank die Kosten der Abfrage übersteigen würden.
Es ist schneller, weil:
Sie sollten niemals ganze Tabellen senden und die Anwendungsseite zählen!
Zwei Dinge sollten in Betracht gezogen werden
Diese Abfrage wird viel schneller mit einem Index für Benutzer-ID gehen; Wenn Sie keinen Index für Benutzer-ID und keinen der Indizes haben, die Sie bereits mit Benutzer-ID beginnen, führen Sie diesen
aus %Vor%Dadurch wird der Abfrageoptimierer dazu veranlasst, durch den Index zu schauen, anstatt den Tisch zu berühren.
Warum sollten Sie nicht jede Spalte in jeder Zeile holen, nur um die Zeile zu zählen?
Sie können das durch
ersetzen %Vor%wobei id der Primärschlüssel oder
ist %Vor% Sie müssen feststellen, welche Abfrage schneller ist, SELECT COUNT(id)
oder SELECT COUNT(1)
Wenn Sie die Daten während des Zählens nicht benötigen, lassen Sie das Zählen auf dem Server geschehen.
Nur eine persönliche Meinung:
Wenn Ihre "detaillierte" Abfrage in 100% der Fälle nicht benötigt wird, dann ist es sinnvoll, die Funktion count()
von MySQL zu verwenden. Es ist schneller und billiger: MySQL erledigt die "schwere" Aufgabe und sendet einen winzigen Datenblock, anstatt einen riesigen Datenblock zu senden und Ihre App die "schwere" Aufgabe zu behalten, das Recordset zu durchlaufen und die Zeilen zu zählen. p>
Wie gesagt, der übliche Tipp: Stellen Sie sicher, dass Ihre Tabellen richtig indiziert sind, damit Ihre Abfragen optimal ablaufen.