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

Optimiser MySQL ORDER BY sur un calcul partagé avec WHERE

Non, le calcul ne sera pas effectué deux fois s'il est écrit exactement de la même manière. Cependant, si votre objectif est d'améliorer les performances de votre application, vous voudrez peut-être regarder la situation dans son ensemble plutôt que de vous concentrer sur ce détail mineur qui pourrait vous donner au plus une différence d'un facteur deux. Un problème plus grave est que votre requête empêche une utilisation efficace des index et entraînera une analyse complète.

Je vous recommande de modifier votre base de données afin d'utiliser le type de géométrie et de créer un index spatial sur vos données. Ensuite, vous pouvez utiliser MBRAwithin pour trouver rapidement les points qui se trouvent à l'intérieur de la boîte englobante de votre cercle. Une fois que vous avez trouvé ces points, vous pouvez exécuter votre test de distance le plus cher sur ces points uniquement. Cette approche sera beaucoup plus rapide si votre tableau est volumineux et qu'une recherche typique ne renvoie qu'une petite fraction des lignes.

Si vous ne pouvez pas modifier le modèle de données, vous pouvez toujours améliorer les performances en utilisant d'abord une case englobante, par exemple WHERE x BETWEEN 10 AND 20 AND y BETWEEN 50 AND 60 . La case à cocher englobante pourra utiliser un index, mais comme les index R-Tree ne sont pris en charge que sur le type de géométrie, vous devrez utiliser l'index B-Tree standard qui n'est pas aussi efficace pour ce type de requête (mais toujours beaucoup mieux que ce que vous faites actuellement).