Una consulta SQL que busca filas que satisfagan la Columna1 <= X <= Columna2 es muy lenta

Estoy usando una base de datos MySQL y tengo la siguiente tabla:

CREATE TABLE SomeTable (
  PrimaryKeyCol BIGINT(20) NOT NULL,
  A BIGINT(20) NOT NULL,
  FirstX INT(11) NOT NULL,
  LastX INT(11) NOT NULL,
  P INT(11) NOT NULL,
  Y INT(11) NOT NULL,
  Z INT(11) NOT NULL,
  B BIGINT(20) DEFAULT NULL,
  PRIMARY KEY (PrimaryKeyCol),
  UNIQUE KEY FirstLastXPriority_Index (FirstX,LastX,P)
) ENGINE=InnoDB;

La tabla contiene 4,3 millones de filas, y nunca cambia una vez inicializada.

Las columnas importantes de esta tabla sonFirstX, LastX, Y, Z yP.

Como puede ver, tengo un índice único en las filasFirstX, LastX yP.

Las columnasFirstX yLastX definir un rango de enteros.

La consulta que necesito ejecutar en esta tabla obtiene para una X dada todas las filas que tienen FirstX <= X <= LastX (es decir, todas las filas cuyo rango contiene el número de entrada X).

Por ejemplo, si la tabla contiene las filas (estoy incluyendo solo las columnas relevantes):

FirstX     LastX      P        Y         Z
------     ------     -       ---       ---
100000     500000     1       111       222 
150000     220000     2       333       444
180000     190000     3       555       666
550000     660000     4       777       888   
700000     900000     5       999       111 
750000     850000     6       222       333 

y necesito, por ejemplo, las filas que contienen el valor185000, el primero3 Las filas deben ser devueltas.

La consulta que probé, que debería usar el índice, es:

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

Incluso sin el LÍMITE, esta consulta debería devolver una pequeña cantidad de registros (menos de50) para cualquier X.

Esta consulta fue ejecutada por una aplicación Java para120000 valores de X. Para mi sorpresa, se hizo cargo10 horas (!) y el tiempo promedio por consulta fue0.3 segundos.

Esto no es aceptable, ni siquiera casi aceptable. Debería ser mucho más rápido.

Examiné una sola consulta que tomó0.563 segundos para asegurarse de que se estaba utilizando el índice. La consulta que probé (igual que la consulta anterior con un valor entero específico en lugar de?) devuelto2 filas.

solíaEXPLAIN para averiguar qué estaba pasando:

id               1
select_type      SIMPLE
table            SomeTable 
type             range
possible_keys    FirstLastXPriority_Index
key              FirstLastXPriority_Index 
key_len          4
ref              NULL
rows             2104820
Extra            Using index condition

Como puede ver, la ejecución involucró2104820 filas (casi el 50% de las filas de la tabla), aunque solo 2 filas satisfacen las condiciones, por lo que se examina la mitad del índice para devolver solo 2 filas.

¿Hay algo mal con la consulta o el índice? ¿Puede sugerir una mejora para la consulta o el índice?

EDITAR:

Algunas respuestas sugirieron que ejecutara la consulta en lotes para múltiples valores de X. No puedo hacer eso, ya que ejecuto esta consulta en tiempo real, ya que las entradas llegan a mi aplicación. Cada vez que llega una entrada X, debo ejecutar la consulta para X y realizar algún procesamiento en la salida de la consulta.

Respuestas a la pregunta(11)

Su respuesta a la pregunta