Encontré una solución que se basa en las propiedades de los datos en la tabla. Preferiría tener una solución más general que no dependa de los datos actuales, pero por el momento es lo mejor que tengo.
El problema con la consulta original:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
es que la ejecución puede requerir escanear un gran porcentaje de las entradas en el FirstX
,LastX
,P
índice cuando la primera condición FirstX <= ?
es satisfecho por un gran porcentaje de las filas.
Lo que hice para reducir el tiempo de ejecución fue observar que LastX-FirstX
es relativamente pequeño.
Ejecuté la consulta:
SELECT MAX(LastX-FirstX) FROM SomeTable;
y obtuve 4200000
.
Esto significa que FirstX >= LastX – 4200000
para todas las filas de la tabla.
Entonces, para satisfacer LastX >= ?
, también debemos satisfacer FirstX >= ? – 4200000
.
Entonces podemos agregar una condición a la consulta de la siguiente manera:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
En el ejemplo que probé en la pregunta, la cantidad de entradas de índice procesadas se redujo de 2104820
a 18
y el tiempo de ejecución se redujo de 0,563 segundos a 0,0003 segundos .
Probé la nueva consulta con el mismo 120000
valores de X
. El resultado fue idéntico a la consulta anterior. El tiempo bajó de más de 10 horas a 5,5 minutos , que es más de 100 veces más rápido .