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 .