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

C'è una differenza di prestazioni tra BETWEEN e IN con MySQL o in SQL in generale?

BETWEEN dovrebbe supera IN in questo caso (ma fai misurare e controllare anche i piani di esecuzione!), in particolare come n cresce e poiché le statistiche sono ancora accurate. Assumiamo:

  • m è la dimensione del tuo tavolo
  • n è la dimensione della tua gamma

È possibile utilizzare l'indice (n è minuscolo rispetto a m )

  • In teoria, BETWEEN può essere implementato con un singolo "range scan" (Oracle speak) sull'indice della chiave primaria, e quindi attraversare al massimo n nodi foglia indice. La complessità sarà O(n + log m)

  • IN è solitamente implementato come una serie (ciclo) di n "scansioni dell'intervallo" sull'indice della chiave primaria. Con m essendo la dimensione della tabella, la complessità sarà sempre O(n * log m) ...che è sempre peggio (neglibile per tavoli molto piccoli m o intervalli molto piccoli n )

Impossibile utilizzare l'indice (n è una parte significativa di m )

In ogni caso, otterrai una scansione completa della tabella e valuterai il predicato su ogni riga:

  • BETWEEN deve valutare due predicati:uno per il limite inferiore e uno per il limite superiore. La complessità è O(m)

  • IN deve valutare al massimo n predicati. La complessità è O(m * n) ... che è sempre peggio, o forse O(m) se il database può ottimizzare il IN list deve essere una hashmap, piuttosto che un elenco di predicati.