Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1743 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Améliorer une requête MySQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Améliorer une requête MySQL

n°1864122
DaSayan
Posté le 20-03-2009 à 16:24:38  profilanswer
 

Bonjour à tous,
 
J'ai une petite question : je dois effectuer une requête pour récupérer 5000 enregistrements sur une base MySql via PHP, et dont je n'ai que les id, et je me demande ce qui serait le plus rapide...
 
- Faire un SELECT * FROM demande WHERE DEM_ID IN ( 104737, 400385, 400939, 400941, 401028.... )     où je mets tous mes 5000 id d'un coup, et je les traite tous d'un coup dans le PHP ( ce n'est pas un peu lourd ? )
- Faire un SELECT * FROM demande WHERE DEM_ID IN ( 104737, 400385, 400939, 400941, 401028.... )     mais là je mets les id par bloc de 100 id, et je les traitre par à coup, lançant donc 50 fois la requête.
- Faire un SELECT * FROM demande WHERE DEM_ID = 104737, et donc lancer la requête pour chaque id ( 5000 fois ).
 
La requête peut sembler évidente, mais le script me fait aussi des erreurs de segmentation par moment, donc je me demande si ça ne vient pas de là.
 
Merci d'avance !


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
mood
Publicité
Posté le 20-03-2009 à 16:24:38  profilanswer
 

n°1864147
stealth35
Posté le 20-03-2009 à 16:56:18  profilanswer
 

fait des bench, avec la fonction time();

n°1864164
guybrush02
Posté le 20-03-2009 à 17:38:45  profilanswer
 

Sans doute déjà ne pas faire SELECT * mais bien noter un à un les champs qui t'intéressent uniquement. Ensuite, la 3e version est clairement inintéressante et beaucoup plus couteuse pour mysql.  
 
Pour ma part, je pencherai plutôt pour la première requête.

n°1864166
Surfoo
Ça va ? ok.
Posté le 20-03-2009 à 17:40:38  profilanswer
 

la premiere

n°1864238
nyyx
Posté le 20-03-2009 à 22:28:46  profilanswer
 

1ère option définitive, après tu peux contruire l'ordre de tes resultats avec  
" when 400941 then 1 etc.."

n°1864307
PierreC
Posté le 21-03-2009 à 10:05:59  profilanswer
 

D'où vienne ces 5000 id ? formulaire ? csv ?  
ne serait t'il pas plus rapide d'ecrire les 5000 id dans une table MEMORY ou TEMPORARY puis de faire une jointure ?
 
Tu peux aussi faire des EXPLAIN pour demander à mysql d'expliquer la requete que tu lui donne.?


---------------
Du tofu en Alsace : www.tofuhong.com
n°1864843
DaSayan
Posté le 23-03-2009 à 16:14:07  profilanswer
 

C'est bien ce dont je me doutais un peu, c'est la première qui serait la mieux au niveau stabilité et rapidité...

PierreC a écrit :

D'où vienne ces 5000 id ? formulaire ? csv ?  
ne serait t'il pas plus rapide d'ecrire les 5000 id dans une table MEMORY ou TEMPORARY puis de faire une jointure ?
 
Tu peux aussi faire des EXPLAIN pour demander à mysql d'expliquer la requete que tu lui donne.?

En gros, le principe est le suivant : je réalise un export csv d'une table de demandes, cet export étant lancé par cron le soir à 00h30, et il est ensuite envoyé par mail au client.
Le fait est que les id que j'ai à envoyer chaque soir me sont fournis par une autre application propriétaire du client ( ni PHP, ni MySQL, vraiment aucun rapport ), et par bloc de 5000. Je prends ces id ( il peut y en avoir 0 ou 50000 au final), et je fais donc mes requêtes sur la base par bloc de 5000 demandes. Ainsi, si j'ai 15000 demandes à envoyer, je vais donc faire 3 envois de mails, chacun contenant un csv de 5000 demandes ( car le fichier csv a lui aussi du mal s'il contient plus de 5000 demandes ).
 
Globalement ça tournait bien pour le moment, mais j'avais des erreurs de segmentation, donc je suis en train d'alléger le code ( qui était assez lourd dans sa 1ère version ), et je me demandais donc si je pouvais gratter quelque chose du coté de MySQL...


Message édité par DaSayan le 23-03-2009 à 16:15:31

---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
n°1864931
guybrush02
Posté le 23-03-2009 à 18:19:11  profilanswer
 

Dépendant de la proportion de commandes / produits différents / produits stockés, ne serait-il pas plus efficace de lire l'ensemble de la base de données (en se limitant, bien entendu, aux attributs nécessaires) et de travailler avec une table de hachage pour rechercher les informations des produits ?

n°1865094
stef_dober​mann
Personne n'est parfait ...
Posté le 24-03-2009 à 09:42:56  profilanswer
 

Bonjour,
 
Ensuite ça dépend comment tu construit ta base de données ! ( les table de paramétrage plutôt que les champs libre,... )
Est -ce que le client a besoin de recevoir les données par mail ? tu pourrais peut-être lui proposer de les lire directement sur le serveur et donc de les traiter directement dessus (économie des envois, des traitements de retour)


---------------
Tout à commencé par un rêve...
n°1865187
DaSayan
Posté le 24-03-2009 à 10:54:02  profilanswer
 

guybrush02 a écrit :

Dépendant de la proportion de commandes / produits différents / produits stockés, ne serait-il pas plus efficace de lire l'ensemble de la base de données (en se limitant, bien entendu, aux attributs nécessaires) et de travailler avec une table de hachage pour rechercher les informations des produits ?

Heu.... table de hachage, c'est quoi ça ? [:arn0]  

stef_dobermann a écrit :

Ensuite ça dépend comment tu construit ta base de données ! ( les table de paramétrage plutôt que les champs libre,... )
Est -ce que le client a besoin de recevoir les données par mail ? tu pourrais peut-être lui proposer de les lire directement sur le serveur et donc de les traiter directement dessus (économie des envois, des traitements de retour)

Clairement il veut les recevoir par mails ( c'est son choix technique définitif )
 
 


---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.
mood
Publicité
Posté le 24-03-2009 à 10:54:02  profilanswer
 

n°1867372
guybrush02
Posté le 30-03-2009 à 12:48:08  profilanswer
 

DaSayan a écrit :

Heu.... table de hachage, c'est quoi ça ? [:arn0]  


Une association clé => valeur

n°1867422
DaSayan
Posté le 30-03-2009 à 14:43:27  profilanswer
 

guybrush02 a écrit :


Une association clé => valeur

Ok je vois  :jap:  
Sinon au final, j'ai fait la requête sur les 5000 id d'un coup, et j'ai travaillé mon script pour l'optimiser au maximum ( une seule boucle de traitement, le moins possible de tests, les envois de mails se font d'un coup à la fin et pas petit à petit, etc ) afin d'améliorer les temps de traitements.
Le résultat est impressionnant : le script est presque 10 fois plus rapide et ne fait plus d'erreur de segmentation !  :ouch:  
 
En tout cas merci pour votre aide :)


Message édité par DaSayan le 30-03-2009 à 14:44:02

---------------
Tous les programmeurs sont des auteurs et tous les ordinateurs sont de mauvais acteurs.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Améliorer une requête MySQL

 

Sujets relatifs
[SQL] requete recursive automatiqueErreur de type Warning: mysql_fetch_array()
Lenteurs MySql, my.cnf, tuning Sql ?Creation d'un requete Register vers un serveur sip avec jain-sip
creation interface requete pour utilisateur[resolu]Tenir une requete?
[PHP 5] base de données mysql : commande 'UPDATE' ?Requête mysql
Construction d'une requête 
Plus de sujets relatifs à : Améliorer une requête MySQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR