Ich habe eine große Tabelle (60+) Millionen von Datensätzen.
Ich benutze PHP-Skript, um durch diese Tabelle zu navigieren.
PHP-Skript (mit Paginierung) lädt sehr schnell, weil:
Die Tabellen-Engine ist InnoDB, also SELECT COUNT()
ist sehr langsam und mysql_num_rows()
ist keine Option, also behalte ich die Gesamtzahl der Zeilen (die Nummer, die ich benutze, um Paginierung zu erzeugen) in einer separaten Tabelle (ich aktualisiere diesen Datensatz) total_rows=total_rows-1
und total_rows=total_rows1+1
während DELETE
und INSERT
).
Aber die Frage ist, was mit der Seitenumbruch für Suchergebnisse tun?
Im Moment mache ich das mit 2 Schritten:
1.
%Vor%Hier habe ich alle Suchergebnisse von DataBase bekommen.
2. Jetzt muss ich diese Ergebnisse zählen, um Paginierung zu erstellen. Ich mache das:
%Vor%Und es ist irgendwie langsam.
Wäre es besser, wenn ich es so mache (mit nur einem Schritt)?:
%Vor% Benutze COUNT
, intern wird der Server die Anfrage anders verarbeiten.
Wenn Sie COUNT
ausführen, reserviert der Server nur Speicher, um das Ergebnis der Zählung zu speichern.
Bei Verwendung von mysql_num_rows
verarbeitet der Server die gesamte Ergebnismenge, weist allen diesen Ergebnissen Speicher zu und versetzt den Server in den Abrufmodus, der viele verschiedene Details enthält, z. B. Sperren.
Stellen Sie sich die folgenden Pseudo-Szenarien vor:
SELECT COUNT(*)
Hey Bob, wie viele Leute sind im Klassenzimmer?
mysql_num_rows
Hey Bob, schick alle Leute aus dem Klassenzimmer zu mir, ... Ich zähle sie, um die Anzahl der Leute selbst zu bekommen
Zusammenfassend, wenn Sie mysql_num_rows
verwenden, übertragen Sie alle Datensätze an den Client, und der Client muss die Zählung selbst berechnen.
Benutze COUNT (ID). Es gibt nur die Anzahl zurück. Mit mysql_num_rows($result);
php holen Sie ALLE Daten aus der MySQL-Datei und zählen die Anzahl der gefundenen Ergebnisse.
Und schließlich, benutze keine mysql_ * -Funktionen.
Vorgeschlagene Alternativen
Von dieser Erweiterung wird abgeraten. Stattdessen die MySQLi oder PDO_MySQL Erweiterung sollte verwendet werden. Siehe auch MySQL: Auswahl eines API-Leitfadens und verwandte FAQ für weitere Informationen. Alternativen zu dieser Funktion enthalten:
mysqli_stmt_num_rows () PDOStatement :: rowCount ()
Getestet in inoDB
engine und mysql 5.5.
Der id
hat einen Index und ich denke, das ist sehr schnell
Wenn Sie mehr wollen, müssen Sie einen Index nur für id
oder was immer Sie auswählen möchten.
Caching ist eine andere Lösung, und Sie können aus 1 Satz Datensätzen in wenigen Millisekunden wählen!
Tags und Links optimization php mysql select large-data