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 03/08/2011, 11h22   #1
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 17
Points : 3
Points : 3
Par défaut Base de données lourdes

Bonjour;
Je travaille actuellement sur une base de donnés assez importante 3 tables chacune d 'entre elle contient au minimum 40000 enregistrement:

Voici sa structure:
[IMG] http://www.imgplace.com/viewimg810/584/37sansre.png [/IMG]

Ma requete :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT `civilite`, `name`,`prenom`, `score`,`telephone` FROM  `users` 
 
Left Join users_Adresse_link ON users.UserID=users_Adresse_link.UserID 
Left Join Adresse ON Adresse.AdresseID=users_Adresse_link.AdresseID
 
 
 
Left Join  users_telephone_link ON users.UserID= users_telephone_link.UserID 
Left Join   telephone ON   telephone.telephoneID= users_telephone_link.telephoneID
 
 
 
WHERE users.UserID IN (select last_insert_id(UserID) from users) AND telephone.telephone IN (select telephone FROM telephone where telephone like '%$search%') ORDER BY users.USERID DESC LIMIT 1 ;

Mon probléme est que cette requete met un temps important a m'afficher le resultat

Merci pour votre aide
lambo89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 11h43   #2
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Je vois aucune relation entre tes tables sur ton schema c'est normal ?
Ce qui induit la question suivante :

As tu correctement indéxé les champs qui doivent l'être notamment les clés étrangère ?

-- edit --

C'est quoi le but de cette horreur ^^ :
Code :
users.UserID IN (select last_insert_id(UserID) from users)
Précise nous ce que tu cherche à retirer de ta bdd exactement , on doit sans doute pouvoir simplifier la requête
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 12h00   #3
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 17
Points : 3
Points : 3
Par défaut Base de données lourdes

Citation:
Envoyé par grunk Voir le message
Je vois aucune relation entre tes tables sur ton schema c'est normal ?
Ce qui induit la question suivante :

As tu correctement indéxé les champs qui doivent l'être notamment les clés étrangère ?

-- edit --

C'est quoi le but de cette horreur ^^ :
Code :
users.UserID IN (select last_insert_id(UserID) from users)
Précise nous ce que tu cherche à retirer de ta bdd exactement , on doit sans doute pouvoir simplifier la requête
Code :
users.UserID IN (select last_insert_id(UserID) from users)
je cherche à afficher le dernier user ayant été enrgistré .

Oui mes champs sont indexés, j'ai testé ma requete sur 30 enregistrements et elle fonctionne parfaitement, à 5000 enregistrements sa plante.
lambo89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 12h05   #4
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Bonjour,
c'est en effet une requête complexe, avec join et sous-requetes.

Peut-être aurais-tu intérêt à commencer par :
1/ envoyer "un éclaireur" pour trouver l'id :
-> executer : "select last_insert_id(UserID) AS Id_last from users;"
=> $Id_last = $result['Id_last'];
2/ envoyer "l'infanterie" pour vérifier si le telephone est bien dans la table :
-> executer : "select telephone FROM telephone where telephone like '%$search%'"
=> $tel_search = $result['telephone'];
3/ ne lancer "la grosse artillerie" QUE si on trouve un résultat pour $Id_last et $tel_search.
la fin de la requête étant :
Code :
WHERE users.UserID = '".$Id_last."' AND telephone.telephone = '".$tel_search."' ORDER BY users.USERID DESC LIMIT 1 ;
Je pense que les 2 1eres requetes donneront rapidement un résultat.
Quant à la 3ème ... elle saura tout de suite où chercher.
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/08/2011, 13h45   #5
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Citation:
je cherche à afficher le dernier user ayant été enrgistré
Donc à mon avis
Code :
users.UserID IN (select last_insert_id(UserID) from users)
ne sert à rien puisque
Citation:
ORDER BY users.USERID DESC LIMIT 1
le fait déjà et beaucoup plus vite.

La sous requete du téléphone ne me semble pas contournable.

Comme le dit jreaux62 , il peut être très avantageux de découper les traitements.

Note au passage que 40k ligne dans une table c'est vraiment pas grand chose , donc y'a effectivement un problème quelque part
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 14h24   #6
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 17
Points : 3
Points : 3
Par défaut base de données lourde

Citation:
Envoyé par jreaux62 Voir le message
Bonjour,
c'est en effet une requête complexe, avec join et sous-requetes.

Peut-être aurais-tu intérêt à commencer par :
1/ envoyer "un éclaireur" pour trouver l'id :
-> executer : "select last_insert_id(UserID) AS Id_last from users;"
=> $Id_last = $result['Id_last'];
2/ envoyer "l'infanterie" pour vérifier si le telephone est bien dans la table :
-> executer : "select telephone FROM telephone where telephone like '%$search%'"
=> $tel_search = $result['telephone'];
3/ ne lancer "la grosse artillerie" QUE si on trouve un résultat pour $Id_last et $tel_search.
la fin de la requête étant :
Code :
WHERE users.UserID = '".$Id_last."' AND telephone.telephone = '".$tel_search."' ORDER BY users.USERID DESC LIMIT 1 ;
Je pense que les 2 1eres requetes donneront rapidement un résultat.
Quant à la 3ème ... elle saura tout de suite où chercher.
logique!

une derniere question , c est faisable avec une recherche instantané?
l'utilisateur pourra simplement tapper le numero de telephone et lui afficher le resultat?

si je ne procéde pas ainsi changer de serveur plus performant resoudra t il mon probleme?

Merci
lambo89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 14h31   #7
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Si c'est un utilisateur enregistré, il doit avoir un UserID.
Que tu peux enregistrer dans une session (par exemple)
Ensuite :
Code :
 ... WHERE users.UserID = '".$_SESSION['UserID']."' ...
Si c'est une recherche uniquement sur le num de tél :
-> executer juste :
Code :
"select telephone FROM telephone where telephone like '%$search%'"
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 14h43   #8
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 17
Points : 3
Points : 3
Par défaut base de données lourde

J'ai modifié la requete en ajoutant les alias,en effectuant des index sur la base et en changeant de serveur aussi resultat => 1m36 a 13 sec le temps de l'affichage du resultat.pas loin du 0 , je pense me concentrer sur les index , avez vous une idée ou les placer exactement ?
Merci
lambo89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 15h13   #9
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Bonjour,
petite question : à quoi sert la recherche sur le "telephone" ?
est-elle utile ?
plus précisément : pourquoi faire la recherche d'équivalence dans la BdD alors qu'on peut faire la vérification après, en php.
bon, je me rends compte que ce n'est pas plus clair ...

Citation:
1/ -> executer : "select last_insert_id(UserID) AS Id_last from users;"
=> $Id_last = $result['Id_last'];

2/ -> executer : "select telephone FROM telephone where telephone like '%$search%'"
=> $tel_search = $result['telephone'];


3/ la "grosse" requete :
SELECT `civilite`, `name`,`prenom`, `score`,`telephone` FROM `users`
Left Join users_Adresse_link ON users.UserID=users_Adresse_link.UserID
Left Join Adresse ON Adresse.AdresseID=users_Adresse_link.AdresseID
Left Join users_telephone_link ON users.UserID= users_telephone_link.UserID
Left Join telephone ON telephone.telephoneID= users_telephone_link.telephoneID
WHERE users.UserID = '".$Id_last."' AND telephone.telephone = '%".$tel_search."%' ORDER BY users.USERID DESC LIMIT 1 ;

4/ on récupère donc le telephone de CET utilisateur !
$tel_user_from_bd = ...;

$search -> c'est le tel à vérifier
5/ on a juste à comparer $tel_user_from_bd et $search (en php) :
if(strpos ( $tel_user_from_bd , $search )) {
...
Car c'est surtout cette partie de la requête qui prends prenait un temps fou :
... AND telephone.telephone = '%".$tel_search."%' ...
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 16h13   #10
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
Citation:
me concentrer sur les index , avez vous une idée ou les placer exactement ?
En règle générale on place les index sur les clés ( automatique pour les clé primaire).
On peut également en placer sur les champs qui vont être beaucoup utiliser dans les clauses WHERE.

Attention tout de même, trop d'index peut tuer l'index
grunk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/08/2011, 09h05   #11
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 17
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juin 2011
Messages : 17
Points : 3
Points : 3
Par défaut base de données lourde

Code :
WHERE users.UserID IN (select last_insert_id(UserID) from users) AND telephone.telephone IN (select telephone FROM telephone where telephone like '%$search%') ORDER BY users.USERID DESC LIMIT 1 ;
users.UserID IN (select last_insert_id(UserID) from users)=> recherche le dernier users inscrit suivant l'id


ORDER BY users.USERID DESC LIMIT 1 ;=> recherche le dernier users inscrit suivant l'id

2 conditions qui aboutissent au meme resultat donc double travail , j'ai juste supprimer
"users.UserID IN (select last_insert_id(UserID) from users)"
lambo89 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 12h22.


 
 
 
 
Partenaires

Hébergement Web