dedlfix: Umkreissuche sehr langsam

Beitrag lesen

echo $begrüßung;

Anzahl der Datensätze muss ich aber voher doch abfragen wie soll ich sonst Start und end als Limit sätzen bei der oben genannten abfrage.

Bei der ersten Anfrage fängst du einfach blind mit mit einem LIMIT 0,x an, wobei x die Anzahl der maximal darzustellenden Zeilen ist. Wie die unlimitierte Anzahl der Ergebnismenge zu ermitteln ist, ist im zweiten Teil der Antwort zu lesen. Diese Zahl brauchst du ja nur um einen Pager (Seiten-Navigationselement) auf Seite 1 bis Seite n zu beschränken. Wenn jemand zu Fuß (sei es aus Absicht, oder weil solch ein Seitenaufruf noch "von früher" z.B. in seinen Lesezeichen hängt) eine Seitenzahl > n anfordert, dann lass das Script ruhig so arbeiten, als sei das normal. Es tritt dabei kein Schaden ein, es ergibt nur eine leere Ergebnismenge, weil das LIMIT ins Leere fasst.

Es sind eventuell kleine Korrekturen z.B. für $aktuelleSeite erforderlich. Diese kannst du generell mit

$aktuelleSeite = max(1, min($aktuelleSeite, ceil($unlimitierteAnzahl / $ZeilenProSeite)));

in den Bereich 1..n zurückholen, wenn sie mal da rausgelaufen ist. Diese Korrektur brauchst du aber erst für den Pager anzuwenden, damit der nicht "komisch" aussieht. Für das LIMIT ist sie nicht erforderlich.

Dafür verwende ich mysql_num_rows.

Für ein mysql_num_rows() müssen alle Ergebnisdatensätze zum Client übertragen werden, damit diese Funktion sie zählen kann. Sie anschließend wegzuwerfen oder daraus ein LIMIT zu Fuß nachzubilden ist eine unnötige Ressourcenverwendung. Ein COUNT() in der Datenbank muss nur diesen einen Wert zurückliefern. Du möchtest aber von allen passenden Datensätzen nur dessen Anzahl sowie einen Teil der Ergebnismenge, den du mit LIMIT einschränkst. Genau für den Fall ist das Gespann SQL_CALC_FOUND_ROWS und FOUND_ROWS() vorgesehen. Damit erreichst du genau dein Ergebnis ohne unnötigen Overhead. Anwendungsbeispiel an der verlinkten Handbuchstelle.

echo "$verabschiedung $name";