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ší .