Ik heb een oplossing gevonden die afhankelijk is van eigenschappen van de gegevens in de tabel. Ik heb liever een meer algemene oplossing die niet afhankelijk is van de huidige gegevens, maar voorlopig is dat de beste die ik heb.
Het probleem met de oorspronkelijke vraag:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;
is dat de uitvoering mogelijk het scannen van een groot percentage van de vermeldingen in de FirstX
. vereist ,LastX
,P
index wanneer de eerste voorwaarde FirstX <= ?
wordt door een groot percentage van de rijen bevredigd.
Wat ik deed om de uitvoeringstijd te verkorten, is dat LastX-FirstX
is relatief klein.
Ik heb de query uitgevoerd:
SELECT MAX(LastX-FirstX) FROM SomeTable;
en kreeg 4200000
.
Dit betekent dat FirstX >= LastX – 4200000
voor alle rijen in de tabel.
Dus om te voldoen aan LastX >= ?
, moeten we ook voldoen aan FirstX >= ? – 4200000
.
We kunnen dus als volgt een voorwaarde aan de query toevoegen:
SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;
In het voorbeeld dat ik in de vraag heb getest, is het aantal verwerkte indexitems verminderd van 2104820
tot 18
en de looptijd werd teruggebracht van 0,563 seconden tot 0.0003 seconden .
Ik heb de nieuwe query getest met dezelfde 120000
waarden van X
. De uitvoer was identiek aan de oude query. De tijd daalde van meer dan 10 uur tot 5,5 minuten , wat meer dan 100 keer sneller is .