SELECT COUNT () vs mysql_num_rows ();

8

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%     
rinchik 12.10.2012, 17:54
quelle

3 Antworten

30

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.

    
Matthew 12.10.2012, 17:58
quelle
2

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 ()

    
CappY 12.10.2012 17:55
quelle
1

Getestet in inoDB engine und mysql 5.5.

Der id hat einen Index und ich denke, das ist sehr schnell

%Vor%

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!

    
Alireza.A 22.12.2015 11:13
quelle