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 .