Našel jsem řešení, které závisí na vlastnostech dat v tabulce. Raději bych měl obecnější řešení, které nezávisí na aktuálních datech, ale prozatím je to to nejlepší, co mám.
Problém s původním dotazem:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
je, že spuštění může vyžadovat skenování velkého procenta položek v FirstX
,LastX
,P
index při první podmínce FirstX <= ?
je splněno velkým procentem řádků.
Co jsem udělal, abych zkrátil dobu provádění, je pozorovat, že LastX-FirstX
je relativně malý.
Spustil jsem dotaz:
SELECT MAX(LastX-FirstX) FROM SomeTable;
a dostal 4200000
.
To znamená, že FirstX >= LastX – 4200000
pro všechny řádky v tabulce.
Abychom tedy uspokojili LastX >= ?
, musíme také splnit FirstX >= ? – 4200000
.
Můžeme tedy do dotazu přidat podmínku takto:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
V příkladu, který jsem testoval v otázce, byl počet zpracovaných položek indexu snížen z 2104820
do 18
a doba běhu byla zkrácena z 0,563 sekund na 0,0003 sekund .
Testoval jsem nový dotaz se stejným 120000
hodnoty X
. Výstup byl totožný se starým dotazem. Čas se zkrátil z více než 10 hodin až 5,5 minuty , která je více než 100krát rychlejší .