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

MIN/MAX vs ORDINE PER e LIMITE

Nel peggiore dei casi, quando stai guardando un campo non indicizzato, usando MIN() richiede un unico passaggio completo della tabella. Usando SORT e LIMIT richiede un filesort. Se eseguito su un tavolo di grandi dimensioni, ci sarebbe probabilmente una differenza significativa nelle prestazioni percepite. Come punto dati aneddotico, MIN() ci sono voluti 0,36 secondi mentre SORT e LIMIT ha preso .84s contro una tabella di 106.000 righe sul mio server di sviluppo.

Se, tuttavia, stai guardando una colonna indicizzata, la differenza è più difficile da notare (il punto dati senza significato è 0,00 s in entrambi i casi). Guardando l'output di spiegare, tuttavia, sembra MIN() è in grado di estrarre semplicemente il valore più piccolo dall'indice (righe 'Seleziona tabelle ottimizzate' e 'NULL') mentre SORT e LIMIT deve ancora eseguire un attraversamento ordinato dell'indice (106.000 righe). L'impatto effettivo sulle prestazioni è probabilmente trascurabile.

Sembra MIN() è la strada da percorrere:è più veloce nel peggiore dei casi, indistinguibile nel migliore dei casi, è SQL standard ed esprime più chiaramente il valore che stai cercando di ottenere. L'unico caso in cui sembra che usando SORT e LIMIT sarebbe auspicabile, come mson menzionato, dove stai scrivendo un'operazione generale che trova i valori N superiori o inferiori da colonne arbitrarie e non vale la pena scrivere l'operazione sui casi speciali.