Sam: Abweichungen in der Row-Reihenfolge bei Order by und Limit

Beitrag lesen

Hallo Forum!

Auf einem MySQL Server (Version 5.0.24a unter Debian Sarge) begegnete ich heute einem interessanten Problem, zu dem ich gerne schlaue Meinungen hören würde.

SITUATION
---------

Folgendes (schön vereinfachtes) Statement:

SELECT e.*, c.title AS cattitle FROM events e LEFT JOIN categories c ON c.id=e.category_id ORDER BY e.category_id DESC LIMIT 100,20

Die Ergebnismenge wird über mehrere Seiten aufgeteilt, die Seitenverteilung läuft wie üblich über die LIMIT-Klausel (Seite 6 hat "LIMIT 100,20", Seite 7 "LIMIT 120,20").

EFFEKT
------

Wenn man zwischen den Seiten wechselt, ist die Ergebnismenge nicht "stabil" - das heißt, die Reihenfolge der zurückgegebenen Rows ändert sich abhängig vom übergebenen Limit. Die Folge: einige Rows werden niemals angezeigt, da sie "wegspringen", also z.B. an Stelle 110 stehen mit "LIMIT 80,20" und an Stelle 89 mit "LIMIT 100,20".

Nach kurzem Stutzen erschien mir das Problem aber eigentlich kein richtiger Fehler in MySQL zu sein: die ORDER BY Klausel wird ja ausgeführt, nur eine Untersortierung passiert nicht.

Ich hätte aber erwartet, dass die Ergebnismenge "stabil" ist - so stellt das ganze ja ein ziemliches Problem für auf mehrere Seiten verteilte Ergebnismengen dar.

Lösen ließ sich das ganze, indem ich SQL_BUFFER_RESULT hinzufügte. Das scheint die Ergebnismenge stabil zu machen.

FRAGE
-----

Was haltet ihr davon? Wie kann man solche Probleme vermeiden? Einfach nur hoffen, dass es nicht passiert? Muss man immer auch noch nach dem Primary Key sortieren, um so etwas zu vermeiden? Wie geht ihr mit dem Problem in euren mehrseitigen Ergebnismengen um?

Viele Grüße, bin gespannt!

Sam