jeg har en videnskabelig database med i øjeblikket 4.300.000 poster. Det er en videnskabelig database, og en API fodrer den. I juni 2020 vil jeg sandsynligvis have omkring 100.000.000 poster.

dette er de layout af tabellen ‘output’:

ID | sensor_ID | speed | velocity | direction-----------------------------------------------------1 | 1 | 10 | 1 | up2 | 2 | 12 | 2 | up3 | 2 | 11.5 | 1.5 | down4 | 1 | 9.5 | 0.8 | down5 | 3 | 11 | 0.75 | up...

det er dummy data. Men output er en tabel med 5 kolonner: ID, sensor_ID, hastighed, hastighed og retning.

hvad jeg vil opnå er en anstændig paginering og filter metode. Jeg vil oprette en hjemmeside (i nodejs), hvor denne +4.000.000 poster (for nu) vil blive vist, 10.000 poster pr. Jeg vil også kunne filtrere på sensor_ID, hastighed, hastighed eller retning.

For nu har jeg denne forespørgsel til valg af specifikke rækker:

SELECT * FROM output ORDER BY ID DESC OFFSET 0 LIMIT 10000 // first 10,000 rowsSELECT * FROM output ORDER BY ID DESC OFFSET 10000 LIMIT 10000 // next 10,000 rows...

jeg søger efter nogle oplysninger / tips om at skabe en anstændig paginering metode. For nu er det stadig stille, som jeg gør det, men jeg tror, det vil være meget langsommere, når vi rammer +50.000.000 poster.

først og fremmest fandt jeg denne side: https://www.citusdata.com/blog/2016/03/30/five-ways-to-paginate/. Jeg er interesseret i keyset pagination. Men for at være ærlig har jeg ingen anelse om, hvordan jeg skal starte.

hvad jeg tror jeg skal gøre:

Opret et indeks på ID-feltet:

CREATE UNIQUE INDEX index_id ON output USING btree (ID)

jeg fandt også denne side: https://leopard.in.ua/2014/10/11/postgresql-paginattion. Når du ruller ned til “Improvement #2: The Seek Method”, kan du se, at de faldt OFFSET-klausul, og bruger en hvor-klausul. Jeg ser også, at de bruger det sidste indsæt ID i deres forespørgsel:

SELECT * FROM output WHERE ID < <last_insert_id_here> ORDER BY ID DESC LIMIT 10000

jeg forstår det ikke fuldt ud. For den første side har jeg brug for det allerførste indsæt ID. Så henter jeg de 10.000 nyeste plader. Men efter det, for at få den anden side, har jeg ikke brug for det allerførste indsæt ID, jeg har brug for det 10.000.sidste indsæt ID (jeg tror).

kan nogen give mig en god forklaring om paginering og filtrering på en hurtig måde.

de ting, jeg bruger:- postgreskl – pgadmin (til databasestyring)- node.js (seneste version)

Tak alle sammen! Hav et godt 2020!

Rediger 1: Jeg har ingen anelse, men kunne massiveJS (https://massivejs.org/) være noget godt at bruge? Og skal jeg bruge det på alle forespørgsler, eller kun på paginering forespørgsler?

Rediger 2: Jeg tror, jeg fik det regnet ud lidt (ret mig, hvis jeg tager fejl).

lad os sige, at jeg har 100.000 poster:

1) Få det sidst indsatte ID

2) Brug dette Sidst indsatte ID til at hente de sidste 10.000 poster

SELECT * FROM output WHERE ID < 100000 ORDER BY ID DESC LIMIT 10000 // last insert ID is here 100,000 because I have 100,000 records

3) vis de 10.000 poster, men gem også indsæt-ID ‘ et for de 10.000 poster, der skal bruges i den næste forespørgsel

4) Få de næste 10.000 poster med det nye sidste indsæt-id

SELECT * FROM output WHERE ID < 90000 ORDER BY ID DESC LIMIT 10000 // 90,000 is the very last insert id - 10,000

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.