J'ai une requête que j'ai faite dans une vue MYSQL. Cette vue particulière est au cœur de notre application, nous cherchons donc à la régler. Il y a une clé primaire sur Map_Id, User_No, X, Y. Je suis assez à l'aise de régler les requêtes du serveur SQL, mais je ne suis pas vraiment sûr de la façon dont MySql fonctionne dans cet aspect. Serait-il utile de mettre un index sur les points et update_stamp? Les lectures sur cette table sont de 90%, donc bien qu'il y ait beaucoup d'insertions, cela ne se compare pas à la quantité de lectures. Description: Obtenir la personne ayant le plus de points pour chaque coordonnée x, y dans une carte donnée. Cravate rupture par qui a le dernier timbre de mise à jour, puis par ID utilisateur.Optimisation de la requête mysql
SELECT GP.Map_Id AS Map_Id,GP.User_No AS User_No,GP.X AS X,GP.Y AS Y, GP.Points AS Points,GP.Update_Stamp AS Update_Stamp
FROM (Grid_Points GP LEFT JOIN Grid_Points GP2
ON (
(
(GP2.Map_Id = GP.Map_Id) AND (GP2.X = GP.X) AND (GP2.Y = GP.Y) AND
((GP2.Points > GP.Points) OR ((GP2.Points = GP.Points) AND (GP2.Update_Stamp > GP.Update_Stamp)) OR
((GP2.Points = GP.Points) AND (GP2.Update_Stamp = GP.Update_Stamp) AND (GP2.User_No < GP.User_No)))
)
)
)
WHERE ISNULL(GP2.User_No);
En fait, je déteste toutes les parenthèses, mais j'ai dû exporter la vue pour voir la structure et elle les avait mises dedans. J'ai fait une explication et j'ai vu qu'elle faisait un scan complet. Je vais essayer un indice de couverture. Merci beaucoup!! – Codezy
Merci pour l'info. BTW J'ai testé ma solution sur certains échantillons de données, et c'est à peu près la même vitesse, je ne savais pas sur l'autre façon de le faire. La vraie solution que vous mentionnez est dans l'index, Map_Id, X, Y aide beaucoup plus que Points, Update_Stamp, User_No Vous expliquer comment cette requête fonctionne/où je peux lire sur ce style? – MindStalker
Suivez la balise 'most-n-per-group' ici à StackOverflow. Il existe des dizaines de problèmes similaires avec des solutions. –