Angesichts jeder Abfrage (Gruppierung, Joins und Unterabfragen sind alle in beliebiger Kombination möglich), möchte ich es mit Paginierung so effizient wie möglich zu brechen. Im Moment führe ich einfach die Abfrage aus, zähle dann die Anzahl der an PHP zurückgegebenen Zeilen, finde heraus, wie viele Seiten der Daten vorhanden sind, zeige die auf der aktuellen Seite an und gebe die richtigen Links zu den anderen Seiten aus.programmatisch ersetzen SELECT-Felder in SQL-Abfrage zur Ermittlung der Anzahl der Ergebnisse
Scheint mir, dass das potenziell sehr große Ergebnis, das von der Abfrage gesetzt wird, jedoch meistens verschwendet wird. Gibt es eine Möglichkeit, die Abfrage zweimal auszuführen, wenn Sie COUNT (*) zum ersten Mal auswählen, um eine einzelne Zahl mit den zu paginierenden Zeilen zu erhalten, und zum zweiten Mal die ursprüngliche Abfrage mit den richtigen Limits basierend auf der aktuell angezeigten Seite ausführen? Würde dies den Datenbankserver deutlich weniger besteuern?
Für eine triviale Abfrage ist das kein Problem ... ersetzen Sie alles nach SELECT und vor WHERE mit count (*). Dies funktioniert jedoch nicht, wenn eine Gruppierung in der Abfrage vorhanden ist, da Sie die Anzahl in jeder Gruppe und nicht die Gesamtzahl der Zeilen erhalten. Wenn Sie die Spalten a, b und c gruppieren, ist es richtig, count (distinct a, b, c) auszuwählen? Muss für die Bearbeitung von Unterabfragen etwas Besonderes getan werden?
Ich mag die Einfachheit dieser Methode. Besteht die Gefahr einer schlechten Performance? Scheint sicher genug ... –
endete damit aufgrund der möglichen Race-Bedingung von SQL_CALC_FOUND_ROWS mit mehreren gleichzeitigen Anfragen –
Sicher gibt es das Risiko einer schlechten Leistung - diese Abfrage kann nicht viel schneller als die ursprüngliche sein, vor allem, wenn es einige haben Typenklauseln (Überprüfung von Aggregatwerten usw.). Nun, in SQL Land gibt es immer das Risiko einer schlechten Leistung :) – Arvo