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

Una query SQL alla ricerca di righe che soddisfano Column1 <=X <=Column2 è molto lenta

Ho trovato una soluzione che si basa sulle proprietà dei dati nella tabella. Preferirei una soluzione più generale che non dipenda dai dati attuali, ma per il momento è la migliore che ho.

Il problema con la query originale:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;

è che l'esecuzione potrebbe richiedere la scansione di una grande percentuale delle voci nel FirstX ,LastX ,P index quando la prima condizione FirstX <= ? è soddisfatto da una grande percentuale delle righe.

Quello che ho fatto per ridurre il tempo di esecuzione è osservare che LastX-FirstX è relativamente piccolo.

Ho eseguito la query:

SELECT MAX(LastX-FirstX) FROM SomeTable;

e ho ottenuto 4200000 .

Ciò significa che FirstX >= LastX – 4200000 per tutte le righe della tabella.

Quindi per soddisfare LastX >= ? , dobbiamo anche soddisfare FirstX >= ? – 4200000 .

Quindi possiamo aggiungere una condizione alla query come segue:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;

Nell'esempio che ho testato nella domanda, il numero di voci di indice elaborate è stato ridotto da 2104820 a 18 e il tempo di esecuzione è stato ridotto da 0,563 secondi a 0,0003 secondi .

Ho testato la nuova query con lo stesso 120000 valori di X . L'output era identico alla vecchia query. Il tempo è sceso da oltre 10 ore a 5,5 minuti , che è oltre 100 volte più veloce .