Mysql
 sql >> Database >  >> RDS >> Mysql

Query MySQL con limite e grande offset che durano per sempre

LIMIT con un offset è estremamente lento nella maggior parte dei database (ho trovato alcuni documentazione in questo senso per MySQL e sto cercando di trovare un articolo davvero buono che ho letto tempo fa che lo spiega per SQLite). Il motivo è che generalmente viene implementato qualcosa del genere:

  1. Esegui tutta la normale pianificazione delle query come se fosse LIMIT la clausola non c'era
  2. Esamina i risultati fino ad arrivare all'indice che desideri
  3. Inizia a restituire risultati

Cosa significa se si esegue LIMIT 10000, 10 , sarà interpretato come:

  1. Recupera i primi 10.000 risultati e ignorali
  2. Dai i prossimi 10 risultati

C'è un'ottimizzazione banale in cui puoi almeno utilizzare l'indice per i primi 10.000 risultati poiché non ti interessano i loro valori, ma anche in quel caso, il database deve comunque esaminare 10.000 valori di indice prima di darti i tuoi 10 risultati. Potrebbero esserci ulteriori ottimizzazioni che possono migliorare questo, ma nel caso generale non si desidera utilizzare LIMIT con un offset per grandi valori .

Il modo più efficiente per gestire l'impaginazione di cui sono a conoscenza è tenere traccia dell'ultimo indice, quindi se la prima pagina termina con id = 5 , quindi fai il tuo successivo il link ha WHERE id > 5 (con un LIMIT x ovviamente).

EDIT:trovato l'articolo per SQLite . Consiglio vivamente di leggere questo dato che spiega The Right Way™ per fare le cose in SQL. Dal momento che le persone di SQLite sono veramente intelligenti e altri database hanno lo stesso problema, presumo che MySQL lo implementi in modo simile.