J'ai trouvé une solution qui repose sur les propriétés des données de la table. Je préférerais une solution plus générale qui ne dépende pas des données actuelles, mais pour le moment c'est la meilleure que j'ai.
Le problème avec la requête d'origine :
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
est que l'exécution peut nécessiter l'analyse d'un grand pourcentage des entrées dans le FirstX
,LastX
,P
index lorsque la première condition FirstX <= ?
est satisfait par un grand pourcentage de lignes.
Ce que j'ai fait pour réduire le temps d'exécution, c'est observer que LastX-FirstX
est relativement petit.
J'ai lancé la requête :
SELECT MAX(LastX-FirstX) FROM SomeTable;
et j'ai obtenu 4200000
.
Cela signifie que FirstX >= LastX – 4200000
pour toutes les lignes du tableau.
Donc pour satisfaire LastX >= ?
, nous devons également satisfaire FirstX >= ? – 4200000
.
Nous pouvons donc ajouter une condition à la requête comme suit :
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
Dans l'exemple que j'ai testé dans la question, le nombre d'entrées d'index traitées a été réduit de 2104820
à 18
et le temps d'exécution a été réduit de 0,563 seconde à 0,0003 seconde .
J'ai testé la nouvelle requête avec le même 120000
valeurs de X
. La sortie était identique à l'ancienne requête. Le temps est passé de plus de 10 heures à 5,5 minutes , qui est plus de 100 fois plus rapide .