Créer une jointure ou une sous-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 : Créer une jointure ou une sous-requete ?

par Cyrano » 19 août 2005, 00:19

Une seule requête plus complexe et toujours plus performante que deux plus simple parce que ça limite surtout au niveau des échanges sur le réseau entre le client (PHP) et le serveur (SGBD). Le gain est parfois mineur et éventuellement de l'ordre de la miliseconde, mais multiplié par des centaines de requêtes sur un serveur mutualisé, ça finit par bouffer des ressources et ralentir les applications de tout le monde.

réelle optimisation ? que choisir ?

par pierre_jean » 19 août 2005, 00:13

Je fais exactement la meme chose que Adoul actuellement ...

Ma question est de savoir si c'est vraiement optimisé de faire ca plutôt en 1 seule requête, qui devient forcement plus complexe, plutôt que 2 requête simples.

Les gains de performences sont ils existants ou nuls dans l'exemple que donne Adoul ?

Sinon pourquoi préférer cette méthode par rapport à l'autre ... bref je suis à la recherche d'arguments techniques (pas de voiture :p) qui puissent me convaincre de changer tout mon code ;)

merci d'avance

++

par pjl » 18 août 2005, 13:34

Pour construire une voiture, on ne dessine pas le moteur (et ses caractéristiques : puissance, etc.)
en fonction de la place disponible que laisse la carrosserie sous le capot... :langue:
Et pourtant...............
V6 PRV. :wink:

par albat » 18 août 2005, 08:56

Mais comme j'arrive presque toujours à faire ce que je veux en passant par php,
c'est beaucoup de boulot juste pour de l'optimisation...
:afraid:

On ne va pas lancer un débat philosophique, mais je suis persuadé que gérer une BD
plutôt que de tout confier à son code PHP est bien plus qu'une simple question d'optimisation... ;)

Pour construire une voiture, on ne dessine pas le moteur (et ses caractéristiques : puissance, etc.)
en fonction de la place disponible que laisse la carrosserie sous le capot... :langue:

par adoul » 18 août 2005, 00:38

Merci de tes explications !

Je comprends un peu mieux, reste qu'il va falloir qu'un jour ou l'autre je me plonge dedans.
Mais comme j'arrive presque toujours à faire ce que je veux en passant par php, c'est beaucoup de boulot juste pour de l'optimisation...

Merci bonne soirée

par ouckileou » 17 août 2005, 23:34

là c'est simple
tu as tes deux tables documents et keywords, reliées par un champ id (clé primaire/clé étrangère)
tu veux les infos de l'une, correspondant aux critères de l'autre

donc dans le WHERE on filtre les lignes que l'on souhaite suivant un mot-clé
dans le SELECT on nomme les colonnes que l'on souhaite récupérer
et relie ces deux tables grâce à INNER JOIN et grâce aux deux champs "id" et "documentId"
INNER JOIN va dire que pour chaque ligne de la table documents qui a une ligne qui correspond dans la table keywords on prend, s'il n'y a pas de correspondance on ne prend pas
$requete = "
SELECT auteur, titre, dateCreation FROM documents d
INNER JOIN keywords k ON d.id = k.documentId
WHERE keyword = '".$keyword."'";
et comme tu le disais il est effectivement plus judicieux de faire un maximum de choses du coté du SGBD (récupération des requêtes, tri, filtrage...) car c'est beaucoup plus rapide
1 requête c'est mieux que 2 :)

par adoul » 17 août 2005, 23:24

Merci beaucoup, je vais essayer.

J'avoue que je ne comprends pas bien SQL :-)

par ouckileou » 17 août 2005, 23:20

une petite jointure devrait suffire :
$requete = "
SELECT auteur, titre, dateCreation FROM documents d 
INNER JOIN keywords k ON d.id = k.documentId
WHERE keyword = '".$keyword."'";

Créer une jointure ou une sous-requete ?

par adoul » 17 août 2005, 22:54

Bonjour,

Je souhaite faire ceci en une seule requete :

SELECT documentId FROM keywords WHERE keyword = '$keyword';

=> cette requete doit me retourner l'ID des 5 ou 6 documents répondant au mot clé xxx

Ensuite pour chacun de ces ID, je souhaite récupérer

SELECT auteur, titre, dateCreation FROM documents WHERE id = '$id'

=> le but étant d'afficher une table avec les infos des documents (titre, auteur, date, ...) qui répondent au mot clé xxxx

Actuellement je le fais en deux fois gérant cela avec php, mais je suis sur qu'il est possible de faire ça en une seule requete.

Merci beaucoup de votre aide, et bonne soirée.

PS : je souhaite faire quelque chose de très optimisé car les requêtes sont exécutées en live grace à AJAX.