2008-08-27 14 views

risposta

18

Perché nella maggior parte dei casi devi prima ordinare i risultati. Ad esempio, quando esegui una ricerca su Google, you can view only up to 100 pages of results. Non si preoccupano di ordinare per page-rank oltre 1000 siti Web per una determinata parola chiave (o una combinazione di parole chiave).

L'impaginazione è rapida. L'ordinamento è lento.

2

Questa è una domanda davvero vaga. Avremmo bisogno di un esempio concreto per avere un'idea migliore del problema.

+2

Se si guarda il titolo, la domanda ha senso, quando si legge la domanda stessa non ha più senso. –

3

Lubos è giusto, il problema non è il fatto che si sta cercapersone (che prende una quantità enorme di dati dal filo), ma che avete bisogno di capire cosa sta realmente accadendo nella pagina ..

Il fatto che ci sia bisogno di una pagina implica che ci sono molti dati. Un sacco di dati richiede molto tempo per ordinare :)

1

Pensavo volesse dire pagination of the printed page - ecco dove mi sono tagliato i denti. Stavo per entrare in un grande monologo sulla raccolta di tutti i contenuti per la pagina, il posizionamento (un vasto numero di regole qui, i motori di constrait sono abbastanza utili) e la giustificazione ... ma a quanto pare stavi parlando del processo di organizzazione delle informazioni sulle pagine web .

Per quello, immagino gli hit del database. L'accesso al disco è lento. Una volta che hai preso in memoria, l'ordinamento è economico.

0

Naturalmente l'ordinamento su una query casuale richiede un po 'di tempo, ma se si riscontrano problemi con la stessa query impaginata utilizzata regolarmente, c'è qualcosa di sbagliato nell'impostazione del database (indicizzazione errata/nessuna, memoria insufficiente ecc. Non sono un db-manager) o stai pagando seriamente l'impaginazione:

Torto: es. facendo select * from hugetable where somecondition; in una matrice ottenendo il conteggio delle pagine con la matrice.length scegli gli indici rilevanti e imponi la matrice, quindi ripetilo per ogni pagina ... Questo è ciò che chiamo seriamente sbagliato.

La soluzione migliore due query: una che ottiene solo il conteggio e un'altra ottiene i risultati utilizzando limit e offset. (Qualche server proprietario, non standard-sql, potrebbe avere una sola opzione di query, non lo so)

La soluzione sbagliata potrebbe funzionare abbastanza bene su piccoli tavoli (in effetti non è impensabile che sia più veloce su tavoli molto piccoli, perché il il sovraccarico di effettuare due query è più grande di ottenere tutte le righe in una query. Non sto dicendo che è così ...) ma non appena il database inizia a crescere i problemi diventano evidenti.

+0

La combinazione di LIMIT con un offset di grandi dimensioni e un ORDER BY o GROUP BY può ancora richiedere molte risorse, motivo per cui Google non ottiene un conteggio completo (oltre 1000 risultati e una "stima") né paginate oltre i primi 1000 risultati. – thomasrutter

2

Questa domanda sembra abbastanza ben coperto, ma io aggiungere un po 'qualcosa di MySQL specifico cattura fuori un sacco di gente:

Evitare l'uso SQL_CALC_FOUND_ROWS. A meno che il set di dati non sia banale, il conteggio delle corrispondenze e il recupero della quantità di corrispondenze in due query separate sarà molto più veloce. (Se è è banale, noterete a malapena una differenza in entrambi i modi.)

+2

Un casuale sfogliare SO dopo cena, un suggerimento intrigante, un test di 10 minuti e poi un tweak di 10 minuti, et voilà, il carico del mio database si dimezza sul mio sito più pesante! Grazie! – jTresidder

+0

È un buon consiglio. Il conteggio in un'altra query può contare senza recuperare i dati delle righe e può utilizzare solo indici. Tuttavia, funziona in InnoDb come in MyIsam? Ho una strana sensazione che sia diverso ma potrebbe essere sbagliato. – thomasrutter