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

Doctrine Paginator seleziona l'intera tabella (molto lento)?

Dovresti semplificare la tua domanda. Ciò ridurrebbe un po' di tempo di esecuzione. Non posso testare la tua query, ma ecco alcuni suggerimenti:

  • non eseguire l'ordinamento durante l'esecuzione di count()
  • puoi ordinare per orderBy('p.id', 'DESC') , verrebbe utilizzato l'indice
  • invece di leftJoin() potresti usare join() se esiste sempre almeno un record nella tabella unita. Altrimenti quel record viene saltato.
  • KNP/Paginator usa DISTINCT() per leggere solo record distinti, ma ciò potrebbe portare all'utilizzo della tabella disk tmp
  • $query->getArrayResult() utilizza la modalità di idratazione dell'array, che restituisce un array multidimensionale ed è molto più veloce dell'hidration degli oggetti per set di risultati di grandi dimensioni
  • potresti utilizzare select('partial p.{id, other used fields}') parziale , in questo modo caricheresti solo i campi necessari, magari salterai le relazioni non annullate quando usi l'idratazione degli oggetti
  • controlla il profiler SF EXPLAIN su una determinata query nella sezione della dottrina, forse gli indici non vengono utilizzati
  • p.hashtags e p.likes restituiscono solo una riga o è oneToMany, che moltiplica il risultato
  • forse alcune modifiche al design dei post, che rimuoverebbero alcuni join:
    • avere il campo p.hashtags definito come @ORM\Column(type="array") e hanno memorizzato i valori di stringa dei tag. In seguito, magari utilizzando la ricerca full-text su array serializzato.
    • avere il campo p.likesCount definito come @ORM\Column(type="integer") che avrebbe il conteggio dei Mi piace

Uso KnpLabs/KnpPaginatorBundle e può anche avere problemi di velocità per query complesse.

Solitamente l'utilizzo di LIMIT x,z è lento per DB, perché esegue COUNT sull'intero set di dati. Se gli indici non vengono utilizzati è dolorosamente lento.

Potresti usare un approccio diverso ed eseguire un'impaginazione personalizzata in base all'avanzamento dell'ID, ma ciò complicherebbe il tuo approccio. L'ho usato con set di dati di grandi dimensioni come le tabelle SYSLOG. Ma perdi la funzionalità di ordinamento e conteggio totale dei record.