Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Query Slow lors de l'utilisation de Order By avec la fonction pour calculer la distance entre deux points (long, lat)

Choix :

  1. Intégrez le tri dans votre définition/logique de procédure stockée. Si votre SQL appelant sélectionne dans votre procédure stockée, effectuez le tri et limitez-y . - Cela signifie que vous ne produirez pas 10 000 lignes dans la procédure stockée, juste pour les trier. De plus, si la table a des index, le tri d'origine dans SQL, la sélection peut être beaucoup plus rapide.

  2. Vérifiez que l'indexation est utilisée dans votre tableau. - Les index permettront d'effectuer vos tris plus rapidement lors de la sélection sur la table.

Veuillez nous fournir la définition de la fonction, il serait plus facile de vous aider en plus.

Enfin, essayez de déplacer votre commande et limitez-la directement au sein de votre fonction au lieu de les faire plus tard. Votre fonction peut renvoyer les 10 résultats directement triés et prêts. Si vous le souhaitez, créez deux fonctions - une qui renvoie les résultats complets et une qui les renvoie limités et triés.

Mise à jour :

Après avoir vu votre fonction, il devient évident que vous essayez de commander par une valeur calculée. Le classement par valeurs calculées est extrêmement lent, comme également mentionné dans :

J'essaie de réfléchir à la manière dont vous pourriez "pré-traiter/ordonner" vos données en fonction de col1 ou col2 afin d'accélérer le classement final de vos résultats. Si col1 et col2 sont des colonnes de la table et que funResult est une fonction mathématique qui peut être représentée graphiquement, l'une des deux a un effet plus important sur la valeur de retour de la fonction....

Enfin, si col1 et col2 sont des colonnes de myTable, vous n'avez pas besoin d'utiliser une fonction stockée mais vous pouvez interroger avec, mais cela ne ferait pas une grande différence... Votre principal problème est de commander par une fonction calculée :

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

Mise à jour 2 :

Après avoir creusé le problème du tri à distance calculée, j'ai trouvé que cela avait été demandé et résolu de manière très efficace sur le lien ci-dessous. En ce qui concerne le tri par valeur calculée, comme votre tri par valeur calculée, il est intrinsèquement lent. Consultez les deux liens suivants pour obtenir de l'aide :

Enfin, la réponse qui se rapproche le plus de votre réponse est celle-ci : https://stackoverflow.com/a/4180065/1688441