06-03-2014, 12:32 AM
Salut à tous!
J'ouvre tellement peu les sujets que je n'ai même pas le réflexe de poster ici quand j'ai un problème >.>
J'ai une table MySQL contenant les cases de la carte du jeu, structurée comme ceci:
Je cherche à sélectionner toutes les cases côtières de la carte, d'altitude négative ou nulle. Donc, je cherche toutes les cases (x,y) telles que mer=0 (case terrestre) et altitude<=0 (sous le niveau de la mer), et telles que l'une de ses voisines (x-1,y-1) ou (x-1,y+1) ou (x+1,y-1) ou (x+1,y+1) soit maritime (mer=1).
Le but est de pouvoir inonder ces cases côtières dont l'altitude est négative (logique: une case terrestre voisine de la mer et en-dessous de celle-ci ne reste pas terrestre très longtemps!): la sélection SELECT sera transformée en un UPDATE.
Pour l'instant, j'ai cette requête:
Où je sélectionne les données de la case cotière (case0), ainsi que celles de la case maritime voisine (case1).
La requête s'exécute en 10secondes. Auriez-vous une requête plus véloce, sachant que la table des cases contient 516k cases actuellement (ce nombre ne changera pas)?
J'ouvre tellement peu les sujets que je n'ai même pas le réflexe de poster ici quand j'ai un problème >.>
J'ai une table MySQL contenant les cases de la carte du jeu, structurée comme ceci:
Citation :x INT SIGNED
y INT SIGNED
altitude SMALLINT SIGNED
mer BIT(1)
x,y PRIMARY KEY
Je cherche à sélectionner toutes les cases côtières de la carte, d'altitude négative ou nulle. Donc, je cherche toutes les cases (x,y) telles que mer=0 (case terrestre) et altitude<=0 (sous le niveau de la mer), et telles que l'une de ses voisines (x-1,y-1) ou (x-1,y+1) ou (x+1,y-1) ou (x+1,y+1) soit maritime (mer=1).
Le but est de pouvoir inonder ces cases côtières dont l'altitude est négative (logique: une case terrestre voisine de la mer et en-dessous de celle-ci ne reste pas terrestre très longtemps!): la sélection SELECT sera transformée en un UPDATE.
Pour l'instant, j'ai cette requête:
SELECT `case0`.`x`, `case0`.`y`
FROM `cases` `case0`, `cases` `case1`
WHERE `case0`.`mer`=0 AND `case1`.`mer`=1 AND `case0`.`altitude`<=0 AND (
(`case1`.`x`-1=`case0`.`x` AND `case1`.`y`-1=`case0`.`y`) OR
(`case1`.`x`+1=`case0`.`x` AND `case1`.`y`-1=`case0`.`y`) OR
(`case1`.`x`-1=`case0`.`x` AND `case1`.`y`+1=`case0`.`y`) OR
(`case1`.`x`+1=`case0`.`x` AND `case1`.`y`+1=`case0`.`y`))
Où je sélectionne les données de la case cotière (case0), ainsi que celles de la case maritime voisine (case1).
La requête s'exécute en 10secondes. Auriez-vous une requête plus véloce, sachant que la table des cases contient 516k cases actuellement (ce nombre ne changera pas)?