requête SQL complexe

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics

jeroen
WRInaute accro
WRInaute accro
 
Messages: 2384
Inscription: Ven Aoû 30, 2002 13:35

requête SQL complexe

Message le Mar Nov 14, 2006 22:17

Salut à tous. J'ai un problème SQL un peu complexe.

J'affiche sur ma home la liste des 15 derniers messages du forum, avec le nombre de réponses associées.

Ma table forum est construite comme ça :
- id
- thread (id du premier message)
- titre
- date

Pour l'instant je fait une jointure sur la même table, cette requête marche trés bien, mais comme la table forum commence à grossir la requête commence à être longue.

Code: Tout sélectionner
SELECT f1.titre, f2.thread, count(f2.id) as cnt, max(f2.date) as last, max(f2.id) as last_id
FROM forum as f1, forum as f2
WHERE f1.id=f2.thread
GROUP BY f2.thread ORDER BY last DESC LIMIT 15


Je suis certain qu'il y a une autre méthode. Vous avez une idée ??

A noter que j'ai mis des index sur les champs thread et id

Merci


la maitresse
Nouveau WRInaute
 
Messages: 4
Inscription: Dim Oct 30, 2005 15:27

Message le Mar Nov 14, 2006 23:09

Bonjour,

Quand un modèle de données ne correspond pas question performances, on a le droit de le "casser" (cf cours sur formes normales) pour améliorer en dupliquant un peu d'information. C'est tout à fait admis.

Donc là je dirais d'ajouter un simple trigger (ou dans le code php un insert de plus) qui stocke en permanence les 15 derniers messages dans une table à part (et qui vire le 16eme) et ton "select" devient

Code: Tout sélectionner
Select message from table_last_messages order by mydate


Bye


Tilt
WRInaute passionné
WRInaute passionné
 
Messages: 818
Inscription: Sam Mar 26, 2005 11:48

Message le Mer Nov 15, 2006 14:42

Déjà tu peux enlever les "as" qui ne servent à rien.
Une question: peux tu décrire plus précisément tes tables ?
f1 contient les id,titres et f2 les réponses, c'est ça ?

jeroen
WRInaute accro
WRInaute accro
 
Messages: 2384
Inscription: Ven Aoû 30, 2002 13:35

Message le Mer Nov 15, 2006 15:27

si si, les as servent.

les reponses sont sur la même table

f1 et f2 sont 2 alias de la table forum. c'est la seule solution que j'ai trouvé pour que le group by se passe correctement. SI je ne fait pas ça, l'alternative suivante (classique) n'est pas satisfaisante :

imagine 3 lignes

id | thread | titre | date
1 | 1 | premier thread | date1
2 | 2 | deuxieme thread | date 2
3 | 1 | re: premier thread | date 3

pour selectionner le thread ayant eu la dernière réponse, je peux faire :
Code: Tout sélectionner
SELECT min(id) as id, thread, titre, count(id) as cnt, max(date) as last
FROM forum
GROUP BY thread ORDER BY last DESC LIMIT 1



Lors du regroupement suivant :

1 | 1 | premier thread | date1
3 | 1 | re: premier thread | date 3

il ne sait pas quel titre prendre, car par de "min" ni de "max":
min(id) ok > 1
max(date) ok > date3
mais titre ??

donc je me retrouve avec des titres qui ne correspondent pas...

j'ai testé des temps , hier j'étais à 0.8s pour la requête, aujourd'hui je tombe à moins 1/1000 de secondes. Je suppose donc que la requête est trés ben optimisée, et que le serveur sql à du mal de temps en temps...


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités