Paginering (pagina-uitvoer) zorgt voor de verwerking van grote SELECT-resultaten zonder de server en de applicatie onnodig te belasten. Hoofdbenaderingen:
Voorbeeld (LIMIT/OFFSET)
SELECT * FROM Orders ORDER BY OrderID LIMIT 100 OFFSET 1000;
Deze query retourneert de 1011e – 1110e records. Maar OFFSET dwingt de server nog steeds om de eerste 1000 rijen te sorteren en over te slaan — daarom wordt het traag bij diepe paginering.
Voorbeeld (Keyset/Seek-methode)
SELECT * FROM Orders WHERE OrderID > 1110 ORDER BY OrderID LIMIT 100;
Zo'n query zoekt snel de volgende pagina, zonder middelen te verbruiken voor het tellen van OFFSET, vooral effectief bij aanwezigheid van een index op OrderID.
Misleidend: "Waarom kan paginering via LIMIT/OFFSET slecht presteren bij grote hoeveelheden gegevens en hoe kan dit worden verbeterd?"
Antwoord: Het probleem is dat OFFSET de server dwingt om alle voorgaande rijen te scannen en te sorteren — dat betekent dat hoe dieper je in de pagina's gaat, hoe langzamer het wordt. Optimalisatie — overschakelen naar keyset/seek paging: selecteer niet op basis van offset, maar op de sleutel van de laatste record van de vorige pagina.
-- Verkrijg de volgende pagina op basis van de sleutel SELECT * FROM Orders WHERE OrderID > @LastOrderID ORDER BY OrderID LIMIT 100;
Verhaal
Project: Marktplaats, bestellingen database van 5 jaar (50 miljoen rijen)
Fout: Gebruikten OFFSET voor paginering van bestellingen van oude gebruikers. Queries met OFFSET > 1 miljoen begonnen 30–60 seconden te duren. Dit beïnvloedde rapporten en API's — hierdoor werden de CPU-servers belast en steeg de wachttijd in de wachtrij.
Verhaal
Project: Bedrijf CRM, klantrapporten.
Fout: Bij paginering werd de sorteervolgorde niet in acht genomen en werden geen indexen gebruikt. Prestaties en gegevensintegriteit werden aangetast — gebruikers ontvingen dezelfde records op verschillende pagina's bij wijzigingen in de tabel.
Verhaal
Project: Financieel platform, dashboards.
Fout: Complexe pagineringen werden opgebouwd via gegenereerde dynamische SQL zonder bind-variabelen, wat leidde tot SQL-injecties en problemen met transactiesteun tussen pagina's van gegevens.