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

Ottimizzazione di MySQL ORDER BY su un calcolo condiviso con WHERE

No, il calcolo non verrà eseguito due volte se scritto esattamente allo stesso modo. Tuttavia, se il tuo obiettivo è migliorare le prestazioni della tua applicazione, potresti voler guardare il quadro più ampio piuttosto che concentrarti su questo dettaglio minore che potrebbe darti al massimo un fattore di due differenze. Un problema più serio è che la tua query impedisce un utilizzo efficiente degli indici e risulterà in una scansione completa.

Ti consiglio di modificare il database in modo da utilizzare il tipo di geometria e creare un indice spaziale sui tuoi dati. Quindi puoi utilizzare MBRWithin per trovare rapidamente i punti che si trovano all'interno del rettangolo di selezione del tuo cerchio. Una volta trovati quei punti, puoi eseguire il test della distanza più costoso solo su quei punti. Questo approccio sarà significativamente più veloce se la tua tabella è grande e una ricerca tipica restituisce solo una piccola frazione delle righe.

Se non puoi modificare il modello di dati, puoi comunque migliorare le prestazioni utilizzando prima un riquadro di delimitazione, ad esempio WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60 . Il riquadro di delimitazione sarà in grado di utilizzare un indice, ma poiché gli indici R-Tree sono supportati solo sul tipo di geometria, dovrai utilizzare l'indice B-Tree standard che non è così efficiente per questo tipo di query (ma comunque molto meglio di quello che stai facendo attualmente).