sql >> Database >  >> RDS >> Mysql

MySQL-query traag bij gebruik van Order By met functie om de afstand tussen twee punten te berekenen (lang, lat)

Opties:

  1. Neem sortering op in uw opgeslagen proceduredefinitie/logica. Als uw aanroepende SQL-selectie binnen uw opgeslagen procedure de sortering en limiet daar uitvoert . - Dit betekent dat u geen 10.000 rijen in de opgeslagen procedure zult produceren, alleen om ze te gebruiken. Als de tabel indexen heeft, kan de oorspronkelijke sortering binnen SQL select veel sneller zijn.

  2. Controleer of indexering binnen uw tabel wordt gebruikt. - Indexen zorgen ervoor dat uw sorteringen sneller worden uitgevoerd wanneer u op de tafel selecteert.

Geef ons alstublieft de functiedefinitie, het zou gemakkelijker zijn om u extra te helpen.

Probeer ten slotte uw bestelling te verplaatsen en direct binnen uw functie te beperken, in plaats van ze later te doen. Uw functie kan de 10 resultaten direct gesorteerd en gereed retourneren. Als u wilt, kunt u twee functies maken:een die de volledige resultaten retourneert en een die ze beperkt en gesorteerd retourneert.

Bijwerken:

Na het zien van uw functie wordt het duidelijk dat u probeert te bestellen met een berekende waarde. Bestellen op berekende waarden is extreem traag, zoals ook vermeld in:

Ik probeer te bedenken hoe u uw gegevens kunt "voorbewerken/bestellen" op basis van col1 of col2 om de uiteindelijke volgorde van uw resultaten te versnellen. Als col1 en col2 kolommen van de tabel zijn, en funResult een wiskundige functie is die in een grafiek kan worden gezet, heeft een van de twee een groter effect op de functieretourwaarde....

Ten slotte, als col1 en col2 kolommen van myTable zijn, hoeft u geen opgeslagen functie te gebruiken, maar kunt u er een query mee uitvoeren, maar dit zou geen groot verschil maken... Uw grootste probleem is het ordenen op een berekende functie:

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

Update 2:

Na het zoeken naar het probleem van het sorteren van de berekende afstand, ontdekte ik dat dit op een zeer efficiënte manier is gevraagd en opgelost via de onderstaande link. Met betrekking tot sorteren op een berekende waarde, is sorteren op een berekende waarde inherent traag. Zie de volgende twee links voor extra hulp:

Ten slotte komt dit het dichtst bij uw antwoord: https://stackoverflow.com/a/4180065/1688441



  1. Automatisch aanvullen in de MySQL-opdrachtregelclient

  2. Recursieve subquery's met sorteren

  3. Onjuist gebruik van ruimtelijke/fulltext/hash-index en expliciete indexvolgorde op MySQL 8.0.11

  4. Een multidimensionale array maken op basis van query