[Résolu] Optimisation de LEFT JOIN
15 messages
• Page 1 sur 1
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
[Résolu] Optimisation de LEFT JOIN
Hello tout le monde,
J'ai un gros problème sur une requête.
La petite me prend 5,7 secondes... argh
En fait c un système simple qui permet à la fois d'afficher TOUS les titres présents dans la table j_actualites et de préciser les actualités qui ont déjà été lues (dans la table j_lu_nonlu)
Pour j_actualites ca ressemble à ca :
Pour j_lu_nonlu ca ressemble à ca :
Le but c de diminuer sensiblement la durée forcément
Merci d'avance
J'ai un gros problème sur une requête.
- Code: Tout sélectionner
SELECT ID_actualites, Date_actualites, Titre_actualites, Type_actualites, Actu_lu_nonlu FROM j_actualites LEFT JOIN j_lu_nonlu ON ID_actualites = Actu_lu_nonlu AND j_lu_nonlu.Membre_lu_nonlu = '1' WHERE Date_actualites < '2006-06-21 23:00:00' GROUP BY ID_actualites ORDER BY Date_actualites DESC LIMIT 0, 30
La petite me prend 5,7 secondes... argh
En fait c un système simple qui permet à la fois d'afficher TOUS les titres présents dans la table j_actualites et de préciser les actualités qui ont déjà été lues (dans la table j_lu_nonlu)
Pour j_actualites ca ressemble à ca :
- Code: Tout sélectionner
ID_actualites int(11) Non auto_increment
Date_actualites datetime Non 0000-00-00 00:00:00
Titre_actualites varchar(250) latin1_swedish_ci Non
Description_actualites text latin1_swedish_ci Non
Source_actualites tinyint(2) Non 0
Pour j_lu_nonlu ca ressemble à ca :
- Code: Tout sélectionner
ID_lu_nonlu int(11) Non auto_increment
Actu_lu_nonlu varchar(11) latin1_swedish_ci Non
Membre_lu_nonlu varchar(11) latin1_swedish_ci Non
Le but c de diminuer sensiblement la durée forcément
Merci d'avance
Dernière édition par finstreet le Mer Juin 21, 2006 16:03, édité 1 fois.
-

mr_go - WRInaute passionné

- Messages: 1945
- Inscription: 21 Sep 2005
Tu ne peux pas utiliser des aliases et faire une requete du type :
?
- Code: Tout sélectionner
select id.ID_actu
FROM ID_actualites id, ID_lu_nonlu idnl
WHERE id.ID_actualites = idnl.ID_lu_nonlu AND...
?
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
mr_go a écrit:Tu ne peux pas utiliser des aliases et faire une requete du type :
- Code: Tout sélectionner
select id.ID_actu
FROM ID_actualites id, ID_lu_nonlu idnl
WHERE id.ID_actualites = idnl.ID_lu_nonlu AND...
?
Oui mais dans ce type de requetes ca ne m'affichera que les actus déjà lues non ?
En fait il me faut TOUTE la table j_actualites et que ca ne prenne qu'une partie de la table j_lu_nonlu ...
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
Re: Optimisation de LEFT JOIN
finstreet a écrit:Hello tout le monde,
J'ai un gros problème sur une requête.
...
Tu fait un LEFT JOIN entre un INT et un VARCHAR ?
Tu n'as pas de clé externe ?
- Code: Tout sélectionner
j_actualites LEFT JOIN j_lu_nonlu ON ID_actualites = Actu_lu_nonlu
-> ID_actualites int(11) Non auto_increment
-> Actu_lu_nonlu varchar(11) latin1_swedish_ci Non
Note : ce genre de requête c'est plus simple à optimiser avec un petit export phpMyAdmin comtenant la structure des tables et les index associés.
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
- Code: Tout sélectionner
Tu fait un LEFT JOIN entre un INT et un VARCHAR ?
Tu n'as pas de clé externe ?
Euh... oui... vais me cacher profond dans un trou c ca ? lol
- Code: Tout sélectionner
Note : ce genre de requête c'est plus simple à optimiser avec un petit export phpMyAdmin comtenant la structure des tables et les index associés.
Pas compris là
Edit : Spidetra, en trois mots, il me tue
Marchi marchi marchi marchi
Dernière édition par finstreet le Mer Juin 21, 2006 15:59, édité 1 fois.
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
Re: Optimisation de LEFT JOIN
finstreet a écrit:
- Code: Tout sélectionner
SELECT ID_actualites, Date_actualites, Titre_actualites, Type_actualites, Actu_lu_nonlu FROM j_actualites LEFT JOIN j_lu_nonlu ON ID_actualites = Actu_lu_nonlu AND j_lu_nonlu.Membre_lu_nonlu = '1' WHERE Date_actualites < '2006-06-21 23:00:00' GROUP BY ID_actualites ORDER BY Date_actualites DESC LIMIT 0, 30
Après relecture je comprend pas grand chose à ta syntaxe :
Pourquoi le AND j_lu_nonlu.Membre_lu_nonlu = '1' est avant la clause WHERE ?
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
finstreet a écrit:Note : ce genre de requête c'est plus simple à optimiser avec un petit export phpMyAdmin comtenant la structure des tables et les index associés.
Pas compris là
si ton pb de performance est lié à l'absence d'index ou a des mauvais index, on ne peut pas le voir avec ce que tu postes.
Tu sais quand une requête rame, les premières choses qu'on regarde :
- les index
- les mauvaises jointures
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
Re: Optimisation de LEFT JOIN
spidetra a écrit:Après relecture je comprend pas grand chose à ta syntaxe :
Pourquoi le AND j_lu_nonlu.Membre_lu_nonlu = '1' est avant la clause WHERE ?
J'avais un peu bidouillé mais oui à l'origine c'était bien placé
- spidetra
- WRInaute passionné

- Messages: 1500
- Inscription: 7 Juil 2003
mr_go a écrit:Tu sais quand une requête rame, les premières choses qu'on regarde :
- les index
- les mauvaises jointures
et accessoirement la taille de la table
très honnêtement; non. La taille de la table (nbr d'enregistrements ) n'est pas si importante, c'est vraiment ce que je regarde en dernier.
- shrom
- WRInaute impliqué

- Messages: 865
- Inscription: 5 Juil 2004
spidetra a écrit:Tu sais quand une requête rame, les premières
choses qu'on regarde :
- les index
- les mauvaises jointures
Sans oublier la structure de la base qui peut être fautive et impossible à optimiser, dans ce cas, on remet tout à plat et on recommence
-

finstreet - WRInaute accro

- Messages: 16999
- Inscription: 10 Juil 2005
le_gber a écrit:p'tite question d'un debutant en PHP,
existe-t-il une fonction PHP qui vous retourne le temps qu'un script met a s'executer - ou est-ce dispo dans phpMyAdmin quand would lancé la function en direct?
Merci
si tu les lances une par une, tu as le temps d'afficher
- shrom
- WRInaute impliqué

- Messages: 865
- Inscription: 5 Juil 2004
le_gber a écrit:existe-t-il une fonction PHP qui vous retourne le temps qu'un script met a s'executer - ou est-ce dispo dans phpMyAdmin quand would lancé la function en direct?
Su tu installes un debugger, tu pourras faire ce que l'on appelle du profiling et voir le temps que met une fonction à s'exécuter, le temps global d'exécution du script etc ..
http://xdebug.org/
http://dd.cron.ru/dbg/
http://pecl.php.net/package/apd
15 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- [Résolu] Update / Select LEFT JOIN / et mysql
- double left join
- Question mysql : LEFT JOIN+COUNT
- MySQL problème de requete LEFT JOIN
- [réglé]Reponse double dans une requête avec LEFT JOIN
- Optimisation SQL - Inner Join (3) ou 3 x Select ?
- [resolu]Mysql - optimisation
- Jointure sql problème inner join
- Inner Join sur quatre tables ?
- No space left on device
- Google rachète iRows (tableur en ligne) - 20-11-2006
- Suggestions de requêtes dans Google News - 29-04-2006
- Google rachète Widevine (optimisation vidéo et DRM) - 13-12-2010
- Optimiser le nombre de mots dans les textes de liens - 03-10-2005
- Ranking Metrics lance son blog - 15-01-2007
- Ouverture d'un forum consacré à DeepIndex sur WebRankInfo - 18-01-2003
- Tutoriel URL Rewriting - 01-05-2006
- Formation au référencement Internet plébiscitée : Ranking Metrics - 31-10-2009
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


