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

MySQL Query lento quando si utilizza Order By con la funzione per calcolare la distanza tra due punti (long, lat)

Opzioni:

  1. Incorpora l'ordinamento all'interno della definizione/logica della procedura memorizzata. Se la tua chiamata SQL seleziona all'interno della tua procedura memorizzata, esegui l'ordinamento e il limite lì . - Ciò significa che non produrrai 10.000 righe nella procedura memorizzata, solo per ricorrerle. Inoltre, se la tabella ha indici l'ordinamento originale all'interno di SQL, la selezione potrebbe essere molto più veloce.

  2. Verifica che l'indicizzazione sia utilizzata all'interno della tua tabella. - Gli indici faranno sì che i tuoi ordinamenti vengano eseguiti più rapidamente quando selezioni sulla tabella.

Per favore forniscici la definizione della funzione, sarebbe più facile aiutarti ulteriormente.

Infine, prova a spostare il tuo ordine e limitarlo direttamente all'interno della tua funzione invece di eseguirli in un secondo momento. La tua funzione può restituire i 10 risultati direttamente ordinati e pronti. Se lo desideri, crea due funzioni:una che restituisce i risultati completi e l'altra che li restituisce limitati e ordinati.

Aggiornamento:

Dopo aver visto la tua funzione, diventa evidente che stai cercando di ordinare in base a un valore calcolato. L'ordinamento in base ai valori calcolati è estremamente lento, come menzionato anche in:

Sto cercando di pensare a come "pre-elaborare/ordinare" i dati in base a col1 o col2 per accelerare l'ordinamento definitivo dei risultati. Se col1 e col2 sono colonne della tabella e funResult è una funzione matematica che può essere rappresentata graficamente, una delle due ha un effetto maggiore sul valore restituito dalla funzione....

Infine, se col1 e col2 sono colonne di myTable, non è necessario utilizzare una funzione memorizzata ma è possibile eseguire query con, ma ciò non farebbe una grande differenza... Il tuo problema principale è ordinare in base a una funzione calcolata:

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

Aggiornamento 2:

Dopo aver scavato per il problema dello smistamento della distanza calcolata, ho scoperto che questo è stato chiesto e risolto in modo molto efficiente al link sottostante. In relazione all'ordinamento in base a un valore calcolato, poiché l'ordinamento in base a un valore calcolato è intrinsecamente lento. Vedere i due collegamenti seguenti per ulteriore assistenza:

Infine, la cosa più vicina alla tua risposta è questa: https://stackoverflow.com/a/4180065/1688441