Ich habe eine Lösung gefunden, die auf Eigenschaften der Daten in der Tabelle beruht. Ich hätte lieber eine allgemeinere Lösung, die nicht von den aktuellen Daten abhängt, aber im Moment ist das die beste, die ich habe.
Das Problem mit der ursprünglichen Abfrage:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
ist, dass die Ausführung möglicherweise das Scannen eines großen Prozentsatzes der Einträge in FirstX
erfordert ,LastX
,P
Index, wenn die erste Bedingung FirstX <= ?
wird von einem großen Prozentsatz der Zeilen erfüllt.
Um die Ausführungszeit zu verkürzen, habe ich Folgendes beobachtet:LastX-FirstX
ist relativ klein.
Ich habe die Abfrage ausgeführt:
SELECT MAX(LastX-FirstX) FROM SomeTable;
und bekam 4200000
.
Das bedeutet, dass FirstX >= LastX – 4200000
für alle Zeilen in der Tabelle.
Um also LastX >= ?
zu erfüllen , müssen wir auch FirstX >= ? – 4200000
.
Wir können der Abfrage also wie folgt eine Bedingung hinzufügen:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
In dem Beispiel, das ich in der Frage getestet habe, wurde die Anzahl der verarbeiteten Indexeinträge von 2104820
reduziert bis 18
und die Laufzeit wurde von 0,563 Sekunden reduziert auf 0,0003 Sekunden .
Ich habe die neue Abfrage mit demselben 120000
getestet Werte von X
. Die Ausgabe war identisch mit der alten Abfrage. Die Zeit ging von über 10 Stunden zurück auf 5,5 Minuten , was über 100-mal schneller ist .