Optimisation de requete avec select sum imbriqué multiple

Eléphant du PHP | 231 Messages

15 janv. 2006, 00:57

Après avoir lu http://sqlpro.developpez.com/cours/optimiser/ et avoir plus ou moins appliquer a mes requetes ... je me demande si on peut encore faire mieux en terme d'utilisation des resources pour le serveur ...

Voici la suite des requete qui vont me servir dans la prochaine version de mon jeu pour mettre les achats des joueurs a jour (ce bout de code est censé tout me mettre a jour :) )
voir ci dessous
Ma question est simple est ce qu'on peut faire encore plus light :D
Parce que la y'a beaucoup de select sum quand meme ... imbriquer et c'est pas trop bon pour la rapidité

Pour la version actuel j'utilisait des boucles et plein de variables/constante php la j'en utilise beaucoup moins :lol: ça devrait etre encore mieux ?

Quelqu'un peut il m'aider :P Merci par avance :wink:

J'ai pensé utiliser une table temporaire est ce que ça serait mieux ? du moins pour la requete dans la boucle (une seule executé par boucle ...)

excuser la lisibilité je sais pas comment presenter correctement mes requete (l'indentation :s)
Modifié en dernier par dark_vidor le 15 janv. 2006, 14:54, modifié 1 fois.

Mammouth du PHP | 19672 Messages

15 janv. 2006, 10:39

Modération : mets des espaces dans ton code ! J'ai corrigé, mais j'aimerais ne pas devoir le refaire trop souvent. Des lignes de code sans espace nous font une belle barre de défilement horizontale en plus de rendre le code totalement illisible.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 231 Messages

15 janv. 2006, 14:54

Bon j'ai fait au mieux l'indetation en observant les tuto et ce mysql retourne apres une requete quand on la reaffiche

ça donne apres quelques tentative d'optimisation :
//Création du tableau des joueurs
$array_players = mysql_query("SELECT id FROM players WHERE team != 3 AND activate = 1");

while ($id_players = mysql_fetch_row($array_players))
{
	if(substr($id_players[0], 0, 1) == 1)
	$update_players = mysql_query("
	UPDATE players
		SET restes = 
		(
			SELECT
				players.restes
				+ SUM(planetes.salaire)
				- SUM(achats.total)
				- CEIL(
				  (
					SUM(attaques.u11) +
					SUM(attaques.u12) +
					SUM(attaques.u13) +
					SUM(attaques.u14) +
					SUM(attaques.u15) +
					SUM(attaques.u16)
				  )*".$ent_ter_1.")
				- CEIL(
				  (
					SUM(attaques.u31) +
					SUM(attaques.u32) +
					SUM(attaques.u33)
				  )*".$ent_chass.")
				- SUM(attaques.u41)*".$ent_141."
				- SUM(attaques.u42)*".$ent_142."
				- SUM(attaques.u43)*".$ent_143."
				- SUM(attaques.u44)*".$ent_144."

			FROM players
			LEFT OUTER JOIN planetes ON players.id = planetes.players
			LEFT OUTER JOIN achats ON players.id = achats.planetes
			LEFT OUTER JOIN attaques ON players.id = attaques.planetes
			WHERE players.id = " .$id_players[0] ."
			GROUP BY players.id
		)");

	if(substr($id_players[0], 0, 1) == 2){}
	$update_players = mysql_query("
	UPDATE players
		SET restes = 
		(
			SELECT
				players.restes
				+ SUM(planetes.salaire)
				- SUM(achats.total)
				- CEIL(
				  (
					SUM(attaques.u11) +
					SUM(attaques.u12) +
					SUM(attaques.u13) +
					SUM(attaques.u14) +
					SUM(attaques.u15) +
					SUM(attaques.u16)
				  )*".$ent_ter_2.")
				- CEIL(
				  (
					SUM(attaques.u31) +
					SUM(attaques.u32) +
					SUM(attaques.u33)
				  )*".$ent_chass.")
				- SUM(attaques.u41)*".$ent_241."
				- SUM(attaques.u42)*".$ent_242."
				- SUM(attaques.u43)*".$ent_243."
				- SUM(attaques.u44)*".$ent_244."

			FROM players
			LEFT OUTER JOIN planetes ON players.id = planetes.players
			LEFT OUTER JOIN achats ON players.id = achats.planetes
			LEFT OUTER JOIN attaques ON players.id = attaques.planetes
			WHERE players.id = " .$id_players[0] ."
			GROUP BY players.id
		)");

	mysql_free_result($update_players);
}

//Fédération
$update_add_unite = mysql_query("
UPDATE planete SET 
	u11 = planetes.u11+planetes.p01*".$add_111.",
	u31 = planetes.u31+planetes.p02*".$add_131."
WHERE players BETWEEN 1000000000 AND 2000000000");
mysql_free_result($update_add_unite);

$update_salaire = mysql_query("
UPDATE planetes SET
	salaire = 
	planetes.e01*".$g_e01."
	+ planetes.e02*".$g_e02."
	+ planetes.e03*".$g_e03."
	- CEIL(
		(
			planetes.e01*".$e_e01."
			+ planetes.e02*".$e_e02."
			+ planetes.e03*".$e_e03."
			+ planetes.p01*".$e_p01."
			+ planetes.p02*".$e_p01."
		)*".$ent_infra.")
	- CEIL(
		(
			planetes.u11*".$e_111."
			+ planetes.u12*".$e_112."
			+ planetes.u13*".$e_113."
			+ planetes.u14*".$e_114."
			+ planetes.u15*".$e_115."
			+ planetes.u16*".$e_116."
			+ planetes.u21*".$e_121."
		)*".$ent_ter_1.")
	- CEIL(
		(
			planetes.u31*".$e_131."
			+ planetes.u32*".$e_132."
			+ planetes.u33*".$e_133."
		)*".$ent_chass.")
	- planetes.u41*".$ent_141."
	- planetes.u42*".$ent_142."
	- planetes.u43*".$ent_143."
	- planetes.u44*".$ent_144."
WHERE players BETWEEN 1000000000 AND 2000000000");
mysql_free_result($update_salaire);

//République
$update_add_unite = mysql_query("
UPDATE planete SET 
	u11 = planetes.u11+planetes.p01*".$add_211.",
	u31 = planetes.u31+planetes.p02*".$add_231."
WHERE players BETWEEN 2000000000 AND 3000000000");
mysql_free_result($update_add_unite);

$update_salaire = mysql_query("
UPDATE planetes SET 
	salaire = 
	planetes.e01*".$g_e01."
	+ planetes.e02*".$g_e02."
	+ planetes.e03*".$g_e03."
	- CEIL(
		(
			planetes.e01*".$e_e01."
			+ planetes.e02*".$e_e02."
			+ planetes.e03*".$e_e03."
			+ planetes.p01*".$e_p01."
			+ planetes.p02*".$e_p01."
		)*".$ent_infra.")
	-CEIL(
		(
			planetes.u11*".$e_211."
			+ planetes.u12*".$e_212."
			+ planetes.u13*".$e_213."
			+ planetes.u14*".$e_214."
			+ planetes.u15*".$e_215."
			+ planetes.u16*".$e_216."
			+ planetes.u21*".$e_221."
		)*".$ent_ter_2.")
	-CEIL(
		(
			planetes.u31*".$e_231."
			+ planetes.u32*".$e_232."
			+ planetes.u33*".$e_233."
		)*".$ent_chass.")
	-planetes.u41*".$ent_241."
	-planetes.u42*".$ent_242."
	-planetes.u43*".$ent_243."
	-planetes.u44*".$ent_244."
WHERE players BETWEEN 2000000000 AND 3000000000");
mysql_free_result($update_salaire);
Es ce que c'est encore améliorable ?