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

MySQL:perché il quinto ID nella clausola IN cambia drasticamente il piano di query?

Come hai mostrato, MySQL ha due piani di query alternativi per le query con ORDER BY ... LIMIT n :

  1. Leggi tutte le righe valide, ordinale e seleziona n righe in alto.
  2. Leggi le righe in ordine e interrompi quando n sono state trovate righe qualificanti.

Per decidere quale sia l'opzione migliore, l'ottimizzatore deve stimare l'effetto di filtraggio della tua condizione WHERE. Questo non è semplice, soprattutto per le colonne non indicizzate o per le colonne in cui i valori sono correlati. Nel tuo caso, probabilmente è necessario leggere molto di più della tabella in ordine per trovare le prime 25 righe di qualificazione rispetto a quanto previsto dall'ottimizzatore.

Sono stati apportati diversi miglioramenti al modo in cui vengono gestite le query LIMIT, sia nelle versioni successive della 5.6 (in esecuzione su una versione precedente a GA!), sia nelle versioni più recenti (5.7, 8.0). Ti suggerisco di provare a eseguire l'aggiornamento a una versione successiva e vedere se il problema persiste.

In generale, se si desidera comprendere le decisioni del pianificatore di query, è necessario esaminare la traccia dell'ottimizzatore per la query.