neunzehn83.de

Ein Mann, ein Blog, kein Plan.

Blättern mit MySQL und SQL_CALC_FOUND_ROWS

Verwendet man in einem MySQL-Query die Option SQL_CALC_FOUND_ROWS im Zusammenspiel mit LIMIT, berechnet MySQL die Gesamtzahl der Datensätze unabhängig vom verwendeten Limit.

Beispiel: Will man Daten seitenweise darstellen (-> Pagination), so braucht man z.B. für eine Blätternavigation die Gesamtzahl der vorhandenen Seiten bzw. Zeilen/Datensätze. Die Option SQL_CALC_FOUND_ROWS erspart das doppelte Ausführen des selben Queries, um an die Gesamtzahl zu kommen.

Schlecht

SELECT
    a, b, c
FROM
    table
WHERE  
    /\* wahnsinnig kompliziertes Zeug \*/
LIMIT
    0, 10
 
#--
 
SELECT
    COUNT(\*)
FROM
    table
WHERE
    /\* wahnsinnig kompliziertes Zeug \*/

Besser:

SELECT SQL_CALC_FOUND_ROWS
    a, b, c
FROM
    table
WHERE
    /\* wahnsinnig kompliziertes Zeug \*/
LIMIT
    0, 10

Besonders bei komplexeren Queries schont das den Datenbankserver. Der MySQL-Query-Cache trifft nämlich nicht, wenn das LIMIT (oder sonst irgendwas) verändert wird.

Das Query mit SQL_CALC_FOUND_ROWS und LIMIT gibt wie gewohnt eine eingeschränkte Ergebnismenge zurück. In diesem Beispiel also die ersten 10 Datensätze. Um an die Gesamtzahl der Datensätze zu kommen muss ein zweites Query ausgeführt werden:

SELECT FOUND_ROWS()

Unterm Strich sind das dann trotzdem zwei Queries - aber FOUND_ROWS() gibt lediglich die bereits im ersten Query berechnete Gesamtzahl zurück, zählt also nicht wirklich als komplexes Query.

Eine Sache noch: Unter bestimmten Umständen, z.B. dann wenn nicht sortiert wird, ist das Query mit LIMIT und ohne SQL_CALC_FOUND_ROWS schneller, da das Query beendet ist, sobald das LIMIT erreicht ist. Das ändert aber nichts an der Tatsache, dass unterm Strich die Variante mit SQL_CALC_FOUND_ROWS schneller ist.

Geschrieben am Dienstag, 13. Juli 2010 und abgelegt unter Webtechnik.