sql >> Databasteknik >  >> RDS >> Mysql

MySQL Query Långsam när du använder Order By med funktion för att beräkna avståndet mellan två punkter (lång, lat)

Alternativ:

  1. Inkludera sortering i din lagrade procedurdefinition/logik. Om din anropande SQL välj inom din lagrade procedur utför sorteringen och gränsen där . – Det betyder att du inte kommer att producera 10 000 rader i den lagrade proceduren, bara för att tillgripa dem. Dessutom, om tabellen har index kan originalsortering inom SQL vara mycket snabbare.

  2. Verifiera att indexering används i din tabell. - Indexer gör att dina sorteringar utförs snabbare när du väljer på bordet.

Ge oss funktionsdefinitionen, det skulle vara lättare att hjälpa dig ytterligare.

Slutligen, försök att flytta din beställning och begränsa direkt inom din funktion i stället för att göra dem senare. Din funktion kan returnera de 10 resultaten direkt sorterade och klara. Om du vill, gör två funktioner - en som returnerar de fullständiga resultaten och en som returnerar dem begränsade och sorterade.

Uppdatering:

Efter att ha sett din funktion blir det uppenbart att du försöker beställa efter ett beräknat värde. Att beställa efter beräknade värden går extremt långsamt som också nämnts i:

Jag försöker tänka på hur du kan "förbehandla/beställa" dina data baserat på col1 eller col2 för att påskynda den ultimata ordningen av dina resultat. Om kol1 och kol2 är kolumner i tabellen och funResult är en matematisk funktion som kan ritas i graf har en av de två en högre effekt på funktionens returvärde...

Slutligen, om col1 och col2 är kolumner i myTable, behöver du inte använda en lagrad funktion men kan fråga med, men detta skulle inte göra någon större skillnad...Ditt största problem är att sortera efter en beräknad funktion:

SELECT rowId, ((col1-INPUT_CONST)*2)+(col2*3) AS funResult
FROM myTable
ORDER BY funResult DESC
LIMIT 10

Uppdatering 2:

Efter att ha grävt efter problemet med sortering beräknas avstånd fann jag att detta har frågats och lösts på ett mycket effektivt sätt på länken nedan. I förhållande till att sortera efter ett beräknat värde, som din sortering efter ett beräknat värde är det i sig långsamt. Se följande två länkar för ytterligare hjälp:

Slutligen, det närmaste som kommer ditt svar är detta: https://stackoverflow.com/a/4180065/1688441



  1. MySQL:Hur gör man en snabbare IP-intervallfråga? GeoIP

  2. MySql-tabell till JSON-format

  3. Använda INNER JOIN för att kombinera SQL Server-tabeller och visa dem i ASP.NET-webbformulär

  4. MaxScale Basic Management med MaxCtrl för MariaDB Cluster