Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/01/2012, 22h49   #1
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 2
Points : 2
Par défaut Optimisation de script 2

Bonjour,

J'ai une table avec plusieurs milliers de produits (+80000) et je veux appliquer une marge différente pour chaque tranche de prix.
Pour cela j'ai crée un script php, le problème est que le script met 20 minutes pour s’exécuter complètement et quand je regard le status des requêtes avec mytop elle s’exécutent très lentement, à peine 60/s.

Je demande aux connaisseurs de m'indiquer s'il y a une autre façon afin de l'optimiser


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
 
 
<?php
try
{
        $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
        $bdd = new PDO('mysql:host=localhost;dbname=db', 'user', 'password');
 
        // Selection des produits
        $rep = $bdd->query('SELECT id_product, wholesale_price, price FROM ps_product');
 
		// Préparation de la requête SQL
		$req_price = $bdd->prepare('UPDATE ps_product SET price = :prix WHERE id_product = :id_prod');
 
		//while ($data = $rep->fetch())
		foreach ( $rep AS $data )
			{			
					// Si le prix est entre 0 et 5 euros, mettre le prix a 6 euros
					if ( $data['wholesale_price'] > 0 AND $data['wholesale_price'] <= 5 )
							{
									$prix = 6;
									$req_price->execute(array(
															'prix' => $prix,
															'id_prod' => $data['id_product'])
													);
									unset($prix); 
							}
 
					// Si le prix est entre 5 et 10 euros, application d'une marge de 30%
					if ( $data['wholesale_price'] >= 5 AND $data['wholesale_price'] <= 10 )
							{
									$prix = $data['wholesale_price'] + $data['wholesale_price'] * 30/100;
									$req_price->execute(array(
															'prix' => $prix,
															'id_prod' => $data['id_product'])
													);
									unset($prix); 
							}
 
					// Si le prix est entre 10 et 50 euros, application d'une marge de 20%
					if ( $data['wholesale_price'] > 10 AND $data['wholesale_price'] <= 50 )
							{
									$prix = $data['wholesale_price'] + $data['wholesale_price'] * 20/100;
									$req_price->execute(array(
															'prix' => $prix,
															'id_prod' => $data['id_product'])
													);
									unset($prix);  
							}
 
					// Si le prix est entre 50 et 150 euros, application d'une marge de 15%
					if ( $data['wholesale_price'] > 50 AND $data['wholesale_price'] <= 150 )
							{
									$prix = $data['wholesale_price'] + $data['wholesale_price'] * 15/100;
									$req_price->execute(array(
															'prix' => $prix,
															'id_prod' => $data['id_product'])
													);
									unset($prix); 
							}
 
					// Si le prix est entre 150 et 400 euros, application d'une marge de 10%
					if ( $data['wholesale_price'] > 150 AND $data['wholesale_price'] <= 400 )
							{
									$prix = $data['wholesale_price'] + $data['wholesale_price'] * 10/100;
									$req_price->execute(array(
															'prix' => $prix,
															'id_prod' => $data['id_product'])
													);
									unset($prix); 
							}
 
					// Si le prix est entre 400 et 700 euros, application d'une marge de 8%
					if ( $data['wholesale_price'] > 400 AND $data['wholesale_price'] <= 700 )
							{
									$prix = $data['wholesale_price'] + $data['wholesale_price'] * 8/100;
									$req_price->execute(array(
															'prix' => $prix,
															'id_prod' => $data['id_product'])
													);
									unset($prix); 
							}
 
					// Si le prix est entre 700 et 1500 euros, application d'une marge de 7%
					if ( $data['wholesale_price'] > 700 AND $data['wholesale_price'] <= 1500 )
							{
									$prix = $data['wholesale_price'] + $data['wholesale_price'] * 7/100;
									$req_price->execute(array(
															'prix' => $prix,
															'id_prod' => $data['id_product'])
													);
									unset($prix); 
							}                       
 
 
					// Si le prix est superieur à 1500 euros, application d'une marge de 6%
					if ( $data['wholesale_price'] > 1500 )
							{
									$prix = $data['wholesale_price'] + $data['wholesale_price'] * 6/100;
									$req_price->execute(array(
															'prix' => $prix,
															'id_prod' => $data['id_product'])
													);
									unset($prix);  
							}              
 
			}
 
$rep->closeCursor();    
 
}
catch (Exception $e)
{
        die('Erreur : ' . $e->getMessage());
}
 
 
?>
Merci d'avance
Abou Ilyass est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 00h19   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bonsoir,

Il faut faire ce genre de mise à jour directement sur le serveur de base de données, comme ça :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
UPDATE
   ps_product
SET
   price = (
      CASE
         WHEN (wholesale_price <=  5)   THEN 6
         WHEN (wholesale_price <= 10)   THEN wholesale_price * 0.3
         WHEN (wholesale_price <= 50)   THEN wholesale_price * 0.2
         WHEN (wholesale_price <= 150)  THEN wholesale_price * 0.15
         WHEN (wholesale_price <= 400)  THEN wholesale_price * 0.10
         WHEN (wholesale_price <= 700)  THEN wholesale_price * 0.08
         WHEN (wholesale_price <= 1500) THEN wholesale_price * 0.07
      ELSE wholesale_price * 0.06
      END
   )
Cela doit être instantané non ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 00h42   #3
Invité de passage
 
Inscription : janvier 2012
Messages : 5
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 5
Points : 2
Points : 2
Bonjour,

effectivement le changement est impressionnant! 2s au lieu de 30 minutes.

Merci beaucoup.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
		$bdd->exec('UPDATE
					   ps_product
					SET
					   price = (
						  CASE
							 WHEN (wholesale_price <=  5)   THEN 6
							 WHEN (wholesale_price <= 10)   THEN wholesale_price * 1.3
							 WHEN (wholesale_price <= 50)   THEN wholesale_price * 1.2
							 WHEN (wholesale_price <= 150)  THEN wholesale_price * 1.15
							 WHEN (wholesale_price <= 400)  THEN wholesale_price * 1.10
							 WHEN (wholesale_price <= 700)  THEN wholesale_price * 1.08
							 WHEN (wholesale_price <= 1500) THEN wholesale_price * 1.07
						  ELSE wholesale_price * 1.06
						  END
					   )');
Abou Ilyass est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h36.


 
 
 
 
Partenaires

Hébergement Web