Qual è il modo più efficiente per impaginare il mio sito durante l'esecuzione di query con SQL?

StackOverflow https://stackoverflow.com/questions/52723

  •  09-06-2019
  •  | 
  •  

Domanda

Sto cercando di impaginare i risultati di una query SQL da utilizzare su una pagina web.Il linguaggio e il backend del database sono PHP e SQLite.

Il codice che sto utilizzando funziona in questo modo (la numerazione delle pagine inizia da 0)

http://example.com/tabella?page=0

page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results

Esistono modi più efficienti per eseguire l'impaginazione di questo?

Un problema che posso riscontrare con il mio metodo attuale è che devo memorizzare tutti i 10 (o comunque molti) risultati in memoria prima di iniziare a visualizzarli.Lo faccio perché PDO non garantisce che il conteggio delle righe sarà disponibile.

È più efficiente emettere a COUNT(*) query per sapere quante righe esistono, quindi trasmettere i risultati al browser?

Questo è uno di quelli "dipende dalle dimensioni del tuo tavolo e se il count(*) query richiede una scansione completa della tabella nel backend del database", domande del tipo "fai un po' di profilazione da solo"?

È stato utile?

Soluzione

suggerirei di fare prima il conteggio.un conteggio (chiave primaria) è una query molto efficiente.

Altri suggerimenti

Ho scelto di utilizzare il metodo COUNT(*) due query, perché mi consente di creare un collegamento direttamente all'ultima pagina, cosa che l'altro metodo non consente.L'esecuzione prima del conteggio mi consente anche di eseguire lo streaming dei risultati, quindi dovrebbe funzionare bene con un numero maggiore di record con meno memoria.

La coerenza tra le pagine non è un problema per me.Grazie per l'aiuto.

Esistono diversi casi in cui ho una query abbastanza complessa (unione di tabelle 9-12), che restituisce molte migliaia di righe, che devo impaginare.Ovviamente per impaginare bene è necessario conoscere la dimensione totale del risultato.Con i database MySQL, l'utilizzo della direttiva SQL_CALC_FOUND_ROWS in SELECT può aiutarti a raggiungere questo obiettivo facilmente, anche se non è ancora chiaro se ciò sarà più efficiente per te.

Tuttavia, poiché stai utilizzando SQLite, ti consiglio di attenersi all'approccio a 2 query. Qui è un thread molto conciso sull'argomento.

Dubito che sarà un problema per i tuoi utenti attendere che il backend restituisca dieci righe.(Puoi rimediare essendo bravo a specificare le dimensioni dell'immagine, facendo in modo che il server web negozi i trasferimenti di dati compressi quando possibile, ecc.)

Non credo che ti sarà molto utile fare un conteggio (*) inizialmente.

Se hai a che fare con una codifica complicata:Quando l'utente guarda la pagina x, usa la magia simile a Ajax per precaricare la pagina x+1 per una migliore esperienza utente.

Una nota generale sull'impaginazione:Se i dati cambiano mentre l'utente naviga tra le tue pagine, esso Maggio essere un problema se la tua soluzione richiede un livello molto elevato di coerenza.Ho scritto una nota a riguardo altrove.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top