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
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).
parlare dettagliate sull'implementazione di Google in stile pagination using MySQL
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. MySQLi/Prepared Statements & SQL_CALC_FOUND_ROWS
- 2. Impaginazione MySQL senza doppia interrogazione?
- 3. impaginazione django e RawQuerySet
- 4. Come implementare SQL_CALC_FOUND_ROWS su una query con UNION?
- 5. Query pigro DjangoImpostazione e impaginazione
- 6. Ordine casuale e impaginazione Elasticsearch
- 7. Impaginazione quadro entità C#
- 8. JCR jackrabbit impaginazione
- 9. Mongoid impaginazione
- 10. Impaginazione UIWebView
- 11. Impaginazione BigQuery
- 12. Impaginazione Umbraco
- 13. UIWebView, documento Word office e impaginazione
- 14. Impaginazione in feed come ATOM e RSS?
- 15. Impaginazione con criteri di Hibernate e DISTINCT_ROOT_ENTITY
- 16. Aggiungi Impaginazione MVC e Azure tabella
- 17. direttiva dir-impaginazione angularjs: Aggiornamento impaginazione dopo il filtraggio
- 18. jQuery DataTable Dimensione impaginazione
- 19. Impaginazione in Grails
- 20. Lucene 4 Impaginazione
- 21. Impaginazione in gRPC
- 22. Impaginazione stateless in CouchDB?
- 23. Semplice impaginazione Wordpress AJAX
- 24. impaginazione lato server aggiornabile
- 25. Impaginazione casuale dei risultati
- 26. Impaginazione in Backbone.js
- 27. Impaginazione osservabile RxJs
- 28. PagedDatasource per impaginazione gridview
- 29. mese impaginazione con kaminari
- 30. Controllo impaginazione ASP.NET
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
@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. –
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. –