Jag hittade en lösning som bygger på egenskaperna hos data i tabellen. Jag skulle hellre ha en mer generell lösning som inte beror på aktuell data, men för tillfället är det den bästa jag har.
Problemet med den ursprungliga frågan:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
är att exekveringen kan kräva att en stor andel av posterna i FirstX skannas ,LastX ,P index när det första villkoret FirstX <= ? är nöjd med en stor andel av raderna.
Vad jag gjorde för att minska exekveringstiden är att observera att LastX-FirstX är relativt liten.
Jag körde frågan:
SELECT MAX(LastX-FirstX) FROM SomeTable;
och fick 4200000 .
Det betyder att FirstX >= LastX – 4200000 för alla rader i tabellen.
Så för att uppfylla LastX >= ? , måste vi också uppfylla FirstX >= ? – 4200000 .
Så vi kan lägga till ett villkor till frågan enligt följande:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
I exemplet jag testade i frågan reducerades antalet bearbetade indexposter från 2104820 till 18 och körtiden minskade från 0,563 sekunder till 0,0003 sekunder .
Jag testade den nya frågan med samma 120000 värden på X . Utdata var identisk med den gamla frågan. Tiden sjönk från över 10 timmar till 5,5 minuter , vilket är över 100 gånger snabbare .