Optimisation Requete

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Optimisation Requete

par Hubert Roksor » 02 août 2006, 19:19

Si ton but final est d'éliminer les doublons alors le plus simple serait de créer une table identique mais avec (NomFich, DateFich, SizeFich) comme clé primaire (PRIMARY, ou UNIQUE à la rigueur). Ensuite tu remplis la nouvelle table avec un seul INSERT

Code : Tout sélectionner

INSERT IGNORE INTO nouvelletable SELECT * FROM file
Pour finir tu n'as plus qu'à effacer l'ancienne table et renommer la nouvelle.

Sinon, pour repérer les doublons ce que je recommande c'est d'utiliser une jointure mais ce n'est valable que si tu as une clé primaire. Les jointures sont plus rapides qu'un GROUP BY parce qu'elle ne nécessitent pas de créer une table temporaire et peuvent se baser uniquement sur les indices. En imaginant que FichID est la clé primaire, la requête serait

Code : Tout sélectionner

SELECT t1.NomFich, t1.DateFich, t1.SizeFich FROM file t1 JOIN file t2 USING (NomFich, DateFich, SizeFich) WHERE t2.FichID > t1.FichID
Cette requête trouve tous les enregistrements dans t1 qui possède un double (même NomFich, DateFich, SizeFich) mais dont l'ID est plus grande (autrement dit: "même fichier, ID différente"). Pour accélérer le traitement, ajoute un index sur la table:

Code : Tout sélectionner

ALTER TABLE file ADD INDEX doublon (NomFich, DateFich, SizeFich)
...et n'oublie pas 'OPTIMIZEr la table ;)

par ouckileou » 02 août 2006, 13:43

Comme ça peut-être, en groupant directement sur les 3 critères (nom, date, taille) et en comptant le nombre d'occurences :

Code : Tout sélectionner

SELECT `NomFich`, `DateFich`,`SizeFich`, COUNT(*) AS nb_fich FROM file GROUP BY `NomFich`, `DateFich`,`SizeFich` ORDER BY `NomFich`

Optimisation Requete

par Freddie » 02 août 2006, 11:51

Bonjour,

J'ai une base de données qui recense à peu près 300 000 entrées.

Chaque entrées corresponds à un fichiers sur un disque dur distant.

POur chaque entrée (ou fichiers sauvegardé dans la base) on as le nom du fichier (NomFich), le repertoire du fichier (DirFich) la taille du fichier (SizeFich) ainsi que la date de création (DateFich).

J'ai une requete qui repère les fichier doublons (même nom, même taille et même date de création)

Le prog en php execute ceci :
$requete2 = "SELECT `NomFich`,`DirFich`,`DateFich`,`SizeFich` FROM FILE GROUP BY `NomFich` HAVING count(`NomFich`)>1";
$execution2 = mysql_db_query("manjari",$requete2);
while ($tableau2=mysql_fetch_array($execution2,MYSQL_ASSOC)){
	$Taille = $tableau2['SizeFich'];
	$Nom = $tableau2['NomFich'];
	$Date = $tableau2['DateFich'];
	$requete3 = "SELECT `DirFich`, `SizeFich`,`DateFich` FROM FILE WHERE `NomFich` = '$Nom' AND `SizeFich`= '$Taille' AND `DateFich` = '$Date' ";
La il selectionne les fichiers qui ont le même nom.
Pour chaque fichier qui ont le même nom il vas comparer leur date de création, leur taille. Si ces deux parametre sont egaux le fichiers sera declaré comme doublons.

Donc, voulant exécutez cette requete assez rapidement, sans engorgé le réseau, (au bout de 3H il me trouve que 18 fichiers doublons ) n'y aurait-il pas une requete plus légère ou plus rapide a exécuter ?


Merci