sql >> Database >  >> RDS >> Mysql

Een SQL-query die zoekt naar rijen die voldoen aan Kolom1 <=X <=Kolom2 is erg traag

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 .



  1. Is het mogelijk om naar kolomnamen te verwijzen via bindvariabelen in Oracle?

  2. Versnel het invoegen van grote datasets van txt-bestand naar mySQL met behulp van python

  3. Onderhoudstaken voor SQL-databases automatiseren met SQLCMD

  4. wanneer ik MySQL-databasesysteem met Jena2 gebruik, kreeg ik java.lang.NoSuchMethodError