MySQL-gegevens – Beste manier om paging te implementeren?

Mijn iPhone-app maakt verbinding met mijn PHP-webservice om gegevens op te halen uit een MySQL-database. Een verzoek kan 500 resultaten opleveren.

Wat is de beste manier om paging te implementeren en 20 items tegelijk op te halen?

Stel dat ik de eerste 20 advertenties uit mijn database ontvang. Hoe kan ik nu de volgende 20 advertenties aanvragen?


Antwoord 1, autoriteit 100%

Uit de MySQL-documentatie:

De LIMIT-component kan worden gebruikt om het aantal rijen te beperken dat wordt geretourneerd door de SELECT-instructie. LIMIT heeft een of twee numerieke argumenten, die beide niet-negatieve integer-constanten moeten zijn (behalve bij gebruik van voorbereide instructies).

Bij twee argumenten specificeert het eerste argument de offset van de eerste rij die moet worden geretourneerd, en de tweede specificeert het maximale aantal rijen dat moet worden geretourneerd. De offset van de eerste rij is 0 (niet 1):

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

Om alle rijen op te halen vanaf een bepaalde offset tot aan het einde van de resultatenset, kunt u een groot aantal gebruiken voor de tweede parameter. Deze instructie haalt alle rijen op van de 96e rij tot de laatste:

SELECT * FROM tbl LIMIT 95,18446744073709551615;

Met één argument specificeert de waarde het aantal rijen dat moet worden geretourneerd vanaf het begin van de resultatenset:

SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows

Met andere woorden, LIMIT row_count is gelijk aan LIMIT 0, row_count.


Antwoord 2, autoriteit 40%

Voor 500 records is efficiëntie waarschijnlijk geen probleem, maar als u miljoenen records heeft, kan het voordelig zijn om een ​​WHERE-clausule te gebruiken om de volgende pagina te selecteren:

SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20

De “234374” hier is de id van de laatste record van de vorige pagina die je hebt bekeken.

Hierdoor kan een index op id worden gebruikt om het eerste record te vinden. Als u LIMIT offset, 20gebruikt, kunt u merken dat het steeds langzamer wordt naarmate u naar het einde toe bladert. Zoals ik al zei, maakt het waarschijnlijk niet uit of je maar 200 records hebt, maar het kan een verschil maken met grotere resultatensets.

Een ander voordeel van deze aanpak is dat als de gegevens tussen de oproepen veranderen, u geen records mist of een herhaald record krijgt. Dit komt omdat het toevoegen of verwijderen van een rij betekent dat de offset van alle rijen erna verandert. In jouw geval is het waarschijnlijk niet belangrijk – ik denk dat je verzameling advertenties niet al te vaak verandert en hoe dan ook, niemand zou het merken als ze dezelfde advertentie twee keer achter elkaar krijgen – maar als je op zoek bent naar de “beste manier” dan is dit iets anders om in gedachten te houden bij het kiezen van de te gebruiken aanpak.

Als je LIMIT wilt gebruiken met een offset (en dit is nodig als een gebruiker direct naar pagina 10000 navigeert in plaats van één voor één door pagina’s te bladeren), lees dan dit artikel over late row lookupsom de prestaties van LIMIT te verbeteren met een grote offset .


Antwoord 3, autoriteit 20%

Definieer OFFSETvoor de zoekopdracht. Bijvoorbeeld

pagina 1 – (records 01-10): offset = 0, limit=10;

pagina 2 – (records 11-20) offset = 10, limiet =10;

en gebruik de volgende zoekopdracht:

SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};

voorbeeld voor pagina 2:

SELECT column FROM table
LIMIT 10 OFFSET 10;

Antwoord 4, autoriteit 9%

Er is literatuur over:

Het grootste probleem doet zich voor bij het gebruik van grote OFFSETs. Ze vermijden het gebruik van OFFSETmet een verscheidenheid aan technieken, variërend van selecties van het id-bereik in de WHERE-clausule tot een soort caching of pre-computing pagina’s.

Er zijn voorgestelde oplossingen op Gebruik de INDEX, Luke:


Antwoord 5, autoriteit 3%

Deze tutorial toont een geweldige manier om paginering uit te voeren.
Efficiënte paginering met MySQL

Kortom, vermijd het gebruik van OFFSET of grote LIMIT


Antwoord 6, autoriteit 2%

u kunt ook doen

SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20

Het aantal rijen van de select-instructie (zonder de limiet) wordt vastgelegd in dezelfde select-instructie, zodat u de tabelgrootte niet opnieuw hoeft op te vragen.
U krijgt het aantal rijen met SELECT FOUND_ROWS();


Antwoord 7

Query 1: SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500

Query 2: SELECT * FROM tbl LIMIT 0,500;

Query 1 wordt sneller uitgevoerd met kleine of middelgrote records. Als het aantal records gelijk is aan 5.000 of hoger, is het resultaat vergelijkbaar.

Resultaat voor 500 records:

Query1 duurt 9.9999904632568 milliseconden

Query2 duurt 19.999980926514 milliseconden

Resultaat voor 8.000 records:

Query1 duurt 129,99987602234 milliseconden

Query2 duurt 160.00008583069 milliseconden

Other episodes