sql >> Databasteknik >  >> RDS >> Mysql

En SQL-fråga som söker efter rader som uppfyller Kolumn1 <=X <=Kolumn2 är mycket långsam

Jag hittade en lösning som bygger på egenskaperna hos data i tabellen. Jag skulle hellre ha en mer generell lösning som inte beror på aktuell data, men för tillfället är det den bästa jag har.

Problemet med den ursprungliga frågan:

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

är att exekveringen kan kräva att en stor andel av posterna i FirstX skannas ,LastX ,P index när det första villkoret FirstX <= ? är nöjd med en stor andel av raderna.

Vad jag gjorde för att minska exekveringstiden är att observera att LastX-FirstX är relativt liten.

Jag körde frågan:

SELECT MAX(LastX-FirstX) FROM SomeTable;

och fick 4200000 .

Det betyder att FirstX >= LastX – 4200000 för alla rader i tabellen.

Så för att uppfylla LastX >= ? , måste vi också uppfylla FirstX >= ? – 4200000 .

Så vi kan lägga till ett villkor till frågan enligt följande:

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

I exemplet jag testade i frågan reducerades antalet bearbetade indexposter från 2104820 till 18 och körtiden minskade från 0,563 sekunder till 0,0003 sekunder .

Jag testade den nya frågan med samma 120000 värden på X . Utdata var identisk med den gamla frågan. Tiden sjönk från över 10 timmar till 5,5 minuter , vilket är över 100 gånger snabbare .



  1. Hur strömmar man data från/till SQL Server BLOB-fält?

  2. Hur skapar jag en unik begränsning som också tillåter nollor?

  3. Visa data från databasen med basadapter och listview

  4. Oracle DATE Index