07-03-2014, 09:09 PM
Il y a peut être quelques optimisations SQL à tenter avant de penser à changer ton modèle.
As-tu regardé la manière dont MySQL traite la requête (EXPLAIN)
A vue de nez, il y a des chance qu'il parte sur un bon vieux Table Scan, vérifiant chacune de tes 512K cases.
Un petit index supplémentaire sur 'mer' et 'altitude' pourrait simplifier les choses.
As-tu essayé également d'utiliser la clause EXISTS avec un truc du genre
Si MySQL est pas trop bête, la première partie de la requête devrait utiliser l'index proposé au dessus et la deuxième partie devrait pouvoir s'appuyer en partie sur ta clé primaire.
Tu peux éventuellement rajouter un index mer,x,y qui pourrait booster les perfs de la sous requête (efficacité variable en fonction de la cardinalité des valeurs)
Autre avantage : tu vas éviter la tripotée de doublon qui apparaissent dans ta requête initiale.
As-tu regardé la manière dont MySQL traite la requête (EXPLAIN)
A vue de nez, il y a des chance qu'il parte sur un bon vieux Table Scan, vérifiant chacune de tes 512K cases.
Un petit index supplémentaire sur 'mer' et 'altitude' pourrait simplifier les choses.
As-tu essayé également d'utiliser la clause EXISTS avec un truc du genre
SELECT
c.x, c.y
FROM
cases c
WHERE
c.mer=0
AND c.altitude <= 0
AND EXISTS (
SELECT 1
FROM
cases m
WHERE
m.mer = 1
AND (m.x between c.x -1 AND c.x +1)
AND (m.y between c.y -1 AND c.y +1)
)
Si MySQL est pas trop bête, la première partie de la requête devrait utiliser l'index proposé au dessus et la deuxième partie devrait pouvoir s'appuyer en partie sur ta clé primaire.
Tu peux éventuellement rajouter un index mer,x,y qui pourrait booster les perfs de la sous requête (efficacité variable en fonction de la cardinalité des valeurs)
Autre avantage : tu vas éviter la tripotée de doublon qui apparaissent dans ta requête initiale.
Quand on te dit qu'un projet est terminé à 90%, prépare toi pour les 90% suivant
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC