2011-01-22 15 views
12

Quindi ho una tabella che ha poco più di 5 milioni di righe. Quando uso SQL_CALC_FOUND_ROWS la query si blocca per sempre. Quando lo prendo, la query viene eseguita entro un secondo con LIMIT, 25. La mia domanda è per motivi di impaginazione esiste un'alternativa per ottenere il numero di righe totali?Mysql SQL_CALC_FOUND_ROWS e impaginazione

risposta

6

SQL_CALC_FOUND_ROWS obbliga MySQL a eseguire la scansione di TUTTE le righe corrispondenti, anche se non sarebbero mai state recuperate. Internamente equivale alla stessa query eseguita senza la clausola LIMIT.

Se il filtro che si sta facendo tramite WHERE non è troppo folle, è possibile calcolare e memorizzare nella cache vari tipi di filtri per salvare il carico di scansione completo imposto da calc_found_rows. Esegui fondamentalmente un "select count (*) from ... where ..." per le clausole where più possibili.

Altrimenti, potresti andare in stile Google e solo sputare alcuni numeri di pagina che di tanto in tanto non hanno alcun rapporto con la realtà (sai, vedi "Goooooooooooogle", vai a pagina 3, e all'improvviso esaurisci i risultati).

+0

Sì, alcuni risultati restituirebbero oltre un milione di record in modo che avrebbe senso perché la query si blocca. Beh suppongo che dovrebbe essere solo un link alla pagina successiva o alla pagina precedente, ma non fare l'impaginazione dove ti permette di saltare a pagine diverse. Che se ci sono più di un milione restituiti non penso che vadano a pagina 10k. – John

+0

@Marc, so che questa è una vecchia domanda, ma mi trovo di fronte alla domanda se usare 'SQL_CALC_FOUND_ROWS' o semplicemente rimuovere la clausola' LIMIT' dalla mia query. Dalla tua risposta, sembra che tu stia dicendo che dovrebbero comportarsi allo stesso modo. È un'assunzione sicura da fare, o è più complicato di così? Grazie. –

+0

un po 'più complicato. mentre calc_rows forza mysql a fare una corrispondenza 'where' su tutte le righe, non è in realtà necessario recuperare l'intera riga, quindi ci sono alcuni risparmi non dovendo preparare/recuperare i dati che verranno appena lanciati. ha senso per i record molto grandi (molte colonne) e/o molte righe. su set più piccoli, i risparmi non saranno così evidenti, ma non ho idea di dove sia il punto di cutover. –

-1

Si consiglia di scegliere tra COUNT (*) E SQL_CALC_FOUND_ROWS a seconda della situazione. Se i criteri di ricerca della query utilizzano le righe che sono nell'indice, utilizzare COUNT (*). In questo caso, Mysql "leggerà" dagli indici solo senza toccare i dati effettivi nella tabella mentre il metodo SQL_CALC_FOUND_ROWS caricherà le righe dal disco, cosa che può essere costosa e richiedere tempo su enormi tabelle.

Ulteriori informazioni sull'argomento this article @mysqlperformanceblog.

+1

"Se i criteri di ricerca della query utilizzano righe NON nell'indice - Aggiungi indici" – Andy

+0

L'articolo che hai citato è del 2007. Voglio dire, seriamente, 5 anni dopo ti riferisci ancora? Così tante cose sono cambiate in MySQL. – Andy