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 17/06/2011, 12h23   #1
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Par défaut Optimiser le temps de traitement d'une simple requête qui retourne 800 000 lignes.

Bonjour à tous,

Je voudrais accélerer l'affichage de ma requête qui est toute simple :

Code :
1
2
 
$rq_code_grp=mysql_query("select code_groupe, client from liste_grp");
Voila comment je l'affiche :
Code :
1
2
3
4
5
6
 
// on affiche le resultat dans la zone de selection multiple 
while ($uneligne=mysql_fetch_array($rq_code_grp)) 
{
echo "<option value=".$uneligne['code_groupe'].">".$uneligne['code_groupe']." <b>|</b> ".$uneligne['client']."</option>";
}
Il y a t-il un moyen d'afficher quasi instantanement les 800 000 lignes ?

Merci d'avance pour votre aide
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 12h26   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Tu veux mettre 800 000 options dans ton champ select ? Les utilisateurs seront sûrement ravis
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 13h23   #3
Membre du Club
 
Inscription : août 2009
Messages : 66
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 66
Points : 69
Points : 69
C'est vrai que dans ce cas-là, un champ texte avec auto-completion serait une bien meilleure idée.
NicoD. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 13h33   #4
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
En faite je desire faire un select multiple et balancer les valeurs dans un autre select multiple.

Mais qu'entend tu par "un champ texte avec auto-completion " ?
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h30   #5
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Envoyé par kamnouz Voir le message
Mais qu'entend tu par "un champ texte avec auto-completion " ?
Ben comme google...qui affiche des propositions au fur et à mesure que tu tapes, mais ça ne correspond peut être pas à ton besoin.

A mon avis tu te trompe de table à interroger.
Intéroge la table qui contient uniquement les code_groupe, pour avoir l'exaustivité des codes.
N'utilise liste_grp que pour récupérer les code_groupe d'un client précis.

Je t'assure un champ select multiple avec 800 000 possibilités n'est pas utilisable, sinon, en l'état, ta requête n'est pas optimisable.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 15h47   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 007
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 007
Points : 18 275
Points : 18 275
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par kamnouz Voir le message
En faite je desire faire un select multiple et balancer les valeurs dans un autre select multiple.
Mets-toi un instant à la place de l'utilisateur et demande-toi si tu aimerais dérouler une liste de 800 000 lignes pour trouver le ou les quelques éléments que tu veux sélectionner !

Citation:
Mais qu'entend tu par "un champ texte avec auto-completion " ?
Un champ de formulaire dans lequel l'utilisateur commence à saisir du texte et qui affiche les possibilités en affinant la liste au fur et à mesure de la saisie.

Par exemple, pour un tel champ permettant de sélectionner un nom de personne, l'utilisateur commence à saisir 'D' et le système fait une requête sur la table des personnes avec le nom commençant par D. L'utilisateur continue sa saisie 'DU' et le système commence à restreindre en proposant par exemple 'DUPOND, DUPONT, DURAN, DURAND'. L'utilisateur continue en saisissant 'DUR' et le système ne propose plus que 'DURAN' et 'DURAND'...

Il existe ce genre d'outil dans les bibliothèques Javascript telles que JQuery. On peut paramétrer le nombre de caractères saisis nécessaires pour commencer à requêter la table. Avec 800 000 lignes, il vaut mieux avoir au moins les 3 premiers caractères pour restreindre le nombre de possibilités à afficher et donc accélérer l'affichage.

Mais tu dis que tu désires "faire un select multiple et balancer les valeurs dans un autre select multiple". Cela veut-il dire que, d'après ta requête, l'utilisateur va d'abord sélectionner les groupes puis les clients des groupes sélectionnés ?
Si oui, alors fais deux requêtes, une pour chaque liste, en te basant pour la seconde sur le choix opéré par l'utilisateur :
Code :
WHERE code_groupe IN (...)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 16h03   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 852
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 852
Points : 1 330
Points : 1 330
salut,

c'est presque impossible que code ton code php ne dépasse pas les 30s de génération...
et là même si tu génères la page le temps de génération coté navigateur va être une horreur...

y a pas que ton pauvre select sur la page hein?

donc tu peux:
  • si tu comptes contraindre ton select alors tu peux le faire en choisissant une valeur de contrainte par défaut et bien sur limiter le nombre de propositions renvoyées (10 à 20 max)
  • abandonner le select et passer à un affichage par page de tes résultats pour scinder tes 800000 lignes
  • utiliser l'auto-complétion style google comme le dit skuatamad, en utilisant ajax pour envoyer ce que tu saisis à un script qui génère une liste limitée de suggestions (10 entrées sinon ça devient n'importe quoi pour l'utilisateur)
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 16h34   #8
Futur Membre du Club
 
Homme
Développeur Web
Inscription : novembre 2007
Messages : 185
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : novembre 2007
Messages : 185
Points : 15
Points : 15
Merci beaucoup de l'interet que vous portez à mon problème.

En faite j'ai un 1er select multiple que je remplis via ma requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<tr>
<td><select name="lstbox1" id="one" size="5" multiple="multiple"STYLE="height:150; width:400 ; color:#606060; face:arial; font-weight:bold;"ondblclick="bascule(this,'two')" >
<?php
$rq_code_grp=mysql_query("select code_groupe, client from liste_grp");
// on affiche le resultat dans la zone de selection multiple 
while ($uneligne=mysql_fetch_array($rq_code_grp)) 
{
echo "<option value=".$uneligne['code_groupe'].">".$uneligne['code_groupe']." <b>|</b> ".$uneligne['client']."</option>";
}
?>
</select>
</tr>
Et lorsque je double-clic sur une valeur du 1er select multiple et bien sa le balance dans celui-la :
Code :
1
2
 
<td><select name="code_groupe[]" id="two" ondblclick="bascule(this,'one')"STYLE="height:150 ; width:400; color:#ff0000; face:arial; " multiple="multiple" size="9"> </select>
Donc la solution de champ texte avec auto-completion ne convient pas trop parceque l'utilisateur n'aura pas la possibilité de choisir plusieurs valeurs .

.... Comment faire ?
kamnouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/06/2011, 18h37   #9
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 852
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 852
Points : 1 330
Points : 1 330
déja une présélection obligatoire dans le 1er sélect qui par défaut réduit la list originale

si tu as un index sur ce critère dans ta table tu réduiras drastiquement déjà le temps de parcours...

ton critère pour décider de la méthode c'est combien de résultats doivent pouvoir être sélectionnés (si tu réponds plus de 30 à mon avis tu devrais revoir ta façon de penser ton problème

le problème c'est que on sait pas quel type de choses tu veux traiter...
selon le sujet tu peux scinder ta table en différents sous domaines et donc de faire une cascade de sélections dynamiques qui réduiront les résultats
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h29.


 
 
 
 
Partenaires

Hébergement Web