Performance d'une requete de mise à jour
Posté : 18 janv. 2009, 22:49
Bonjour à tous
J'ai un problème de performance d'une requête de mise à jour d'une table mysql via php.
Je dispose d'une table avec 6000 enregistrements.
Il s'agit d'une liste de boutiques. Une même boutique peut apparaitre plusieurs fois selon le profil de clients à qui elle s'adresse (Particulier, Professionnel, Association, Entrepreneur).
Ainsi une même boutique peut apparaitre 4 fois si elles s'adressent aux 4 profils.
J'ai voulu créé une table avec la liste des boutiques dédoublonnées (elle fait 2000 enregistrements). J'ai créé dans cette table un champ par profil que je veux remplir à 1 si la boutique concerne ce profil.
J'ai donc créé un lien entre la table sans doublons et la table d'origine pour faire la mise à jour :
Je pense avoir indéxé ma table correctement (sur le champ code)
Est ce mon code PHP qui provoque cette durée de requête ?
Cela peut il être amélioré ?
Est ce un problème de code php qui n'est pas optimisé ?
A noter que cette performance est constaté sur wamp en local sur mon poste.
J'ai un problème de performance d'une requête de mise à jour d'une table mysql via php.
Je dispose d'une table avec 6000 enregistrements.
Il s'agit d'une liste de boutiques. Une même boutique peut apparaitre plusieurs fois selon le profil de clients à qui elle s'adresse (Particulier, Professionnel, Association, Entrepreneur).
Ainsi une même boutique peut apparaitre 4 fois si elles s'adressent aux 4 profils.
J'ai voulu créé une table avec la liste des boutiques dédoublonnées (elle fait 2000 enregistrements). J'ai créé dans cette table un champ par profil que je veux remplir à 1 si la boutique concerne ce profil.
J'ai donc créé un lien entre la table sans doublons et la table d'origine pour faire la mise à jour :
$type = array('Associations','Entrepreneurs','Professionnels','Particuliers');
for ($i=0; $i<4 ; $i++)
{
$a=strtolower($type[$i]);
$sql ="select * from source_boutique"
. " INNER JOIN boutique ON source_boutique.code=boutique.code"
. " WHERE source_boutique.type_client = '$type[$i]'";
$resultat=ExecRequete ($sql, $connexion);
while ($tmp = mysql_fetch_array($resultat))
{
$rq="UPDATE pdv SET $a='1'";
ExecRequete ($rq, $connexion);
}
}
Cette requête met plus de 30 secondes à s'effectuer. Compte tenu du nombre d'enregistrements concernés je suis étonné. D'autant que lorsque je lance des requetes simples sur tous les enregistrements directement dans mysql elles s'éxécutent très rapidement.Je pense avoir indéxé ma table correctement (sur le champ code)
Est ce mon code PHP qui provoque cette durée de requête ?
Cela peut il être amélioré ?
Est ce un problème de code php qui n'est pas optimisé ?
A noter que cette performance est constaté sur wamp en local sur mon poste.
Code : Tout sélectionner
CREATE TABLE `boutique` (
`ligne` int(11) NOT NULL AUTO_INCREMENT,
`nom` varchar(128) NOT NULL DEFAULT '',
`code` varchar(8) NOT NULL DEFAULT '',
`adresse` varchar(128) NOT NULL DEFAULT '',
`ville` varchar(32) NOT NULL DEFAULT '',
`cp` varchar(5) NOT NULL DEFAULT '',
`fax` varchar(32) NOT NULL DEFAULT '',
`client` varchar(3) NOT NULL DEFAULT '',
`particuliers` varchar(1) NOT NULL,
`professionnels` varchar(1) NOT NULL,
`entrepreneurs` varchar(1) NOT NULL,
`associations` varchar(1) NOT NULL,
`maj` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`ligne`),
KEY `code` (`code`),
KEY `associations` (`associations`),
KEY `particuliers` (`particuliers`),
KEY `professionnels` (`professionnels`),
KEY `entrepreneurs` (`entrepreneurs`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=2204 ;Code : Tout sélectionner
CREATE TABLE `source_boutique` (
`id` varchar(8) NOT NULL,
`nom` varchar(128) NOT NULL,
`code` varchar(8) NOT NULL,
`adresse` varchar(128) NOT NULL,
`ville` varchar(32) NOT NULL,
`cp` varchar(10) NOT NULL,
`fax` varchar(32) NOT NULL,
`type_client` varchar(32) NOT NULL,
`maj` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;