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 .