Jeg fandt en løsning, der er afhængig af egenskaberne for dataene i tabellen. Jeg vil hellere have en mere generel løsning, der ikke afhænger af de aktuelle data, men foreløbig er det den bedste, jeg har.
Problemet med den oprindelige forespørgsel:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
er, at udførelsen kan kræve scanning af en stor procentdel af indtastningerne i FirstX
,LastX
,P
indeks, når den første betingelse FirstX <= ?
er tilfreds med en stor procentdel af rækkerne.
Det, jeg gjorde for at reducere udførelsestiden, er at observere, at LastX-FirstX
er relativt lille.
Jeg kørte forespørgslen:
SELECT MAX(LastX-FirstX) FROM SomeTable;
og fik 4200000
.
Det betyder, at FirstX >= LastX – 4200000
for alle rækkerne i tabellen.
Så for at tilfredsstille LastX >= ?
, skal vi også opfylde FirstX >= ? – 4200000
.
Så vi kan tilføje en betingelse til forespørgslen som følger:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
I det eksempel, jeg testede i spørgsmålet, blev antallet af behandlede indeksposter reduceret fra 2104820
til 18
og køretiden blev reduceret fra 0,563 sekunder til 0,0003 sekunder .
Jeg testede den nye forespørgsel med den samme 120000
værdier af X
. Outputtet var identisk med den gamle forespørgsel. Tiden faldt fra over 10 timer til 5,5 minutter , hvilket er over 100 gange hurtigere .