sql >> Database teknologi >  >> RDS >> Mysql

En SQL-forespørgsel, der søger efter rækker, der opfylder Kolonne1 <=X <=Kolonne2, er meget langsom

Jeg fandt en løsning, der er afhængig af egenskaberne for dataene i tabellen. Jeg vil hellere have en mere generel løsning, der ikke afhænger af de aktuelle data, men foreløbig er det den bedste, jeg har.

Problemet med den oprindelige forespørgsel:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;

er, at udførelsen kan kræve scanning af en stor procentdel af indtastningerne i FirstX ,LastX ,P indeks, når den første betingelse FirstX <= ? er tilfreds med en stor procentdel af rækkerne.

Det, jeg gjorde for at reducere udførelsestiden, er at observere, at LastX-FirstX er relativt lille.

Jeg kørte forespørgslen:

SELECT MAX(LastX-FirstX) FROM SomeTable;

og fik 4200000 .

Det betyder, at FirstX >= LastX – 4200000 for alle rækkerne i tabellen.

Så for at tilfredsstille LastX >= ? , skal vi også opfylde FirstX >= ? – 4200000 .

Så vi kan tilføje en betingelse til forespørgslen som følger:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND FirstX >= ? - 4200000 AND LastX >= ? LIMIT 10;

I det eksempel, jeg testede i spørgsmålet, blev antallet af behandlede indeksposter reduceret fra 2104820 til 18 og køretiden blev reduceret fra 0,563 sekunder til 0,0003 sekunder .

Jeg testede den nye forespørgsel med den samme 120000 værdier af X . Outputtet var identisk med den gamle forespørgsel. Tiden faldt fra over 10 timer til 5,5 minutter , hvilket er over 100 gange hurtigere .



  1. SQL BESTIL EFTER

  2. 'stuff' og 'for xml path('')' fra SQL Server i Postgresql

  3. Installation af mysql-python på Centos

  4. Hvordan listes aktive/åbne forbindelser i Oracle?