[PHP/SQL] le plus rapide concretement?

le plus rapide concretement? [PHP/SQL] - SQL/NoSQL - Programmation

Marsh Posté le 19-12-2002 à 18:01:57    

il vaut mieux:
- mettre a jour deux tables a chaque post
ou
- faire une sous requete?
 
j'explique...
prenons par ex le forum HFR [:titprem]
imaginons deux tables: une table_topic (contenant le nom du topic le posteur la date etc...) et une table_message (l'auteur, le texte etc...)
lorsque qqun poste un msg dans un topic (donc ds table_message), on peut voir sur la page de listing des topics son nom en tant que dernier posteur. (page generée grace a table_topic)
 
Pour cela, vaut il donc mieux, mettre a jour table_message (avec le corps du message, le nick etc..) ET la table_topic (modif du champ dernier_posteur)
ou
juste la table_message, sachant que pour la generation de la page topic, il y aurait une sousrequetes pour aller chercher le nom et la date du dernier post du topic?
 
 
j'espere que je suis assez clair.. c un brin confu encore ds mon esprit :D


---------------
Suri.morkitu.org : Balades au coeur de la ville...
Reply

Marsh Posté le 19-12-2002 à 18:01:57   

Reply

Marsh Posté le 19-12-2002 à 19:43:54    

methode 1 si tu cherches la rapidite au detriment de la place
methode 2 si tu cherches l'optimisation de la place et la normalisation de ta BDD

Reply

Marsh Posté le 19-12-2002 à 19:55:53    

ok merci :)

Reply

Marsh Posté le 19-12-2002 à 20:26:02    

Et j'opterai pour la possibilité 2, tout à fait personnellement.


---------------
Le site de ma maman
Reply

Marsh Posté le 19-12-2002 à 20:32:55    

Cherrytree a écrit :

Et j'opterai pour la possibilité 2, tout à fait personnellement.


ah? :/j'etais parti sur la 1ere plutot...
perso je prefere faire une seule requete (meme si plus complexe)
mais bon, je cherche la rapidité avant tout...
 
 
argumentes© stp :D


Message édité par Suri le 19-12-2002 à 20:33:25
Reply

Marsh Posté le 19-12-2002 à 22:12:21    

Suri a écrit :


ah? :/j'etais parti sur la 1ere plutot...
perso je prefere faire une seule requete (meme si plus complexe)
mais bon, je cherche la rapidité avant tout...
 
 
argumentes© stp :D

En fait, la normalisation de la base me paraît importante, parce que cela donne une structure conforme à la logique utilisée la plupart du temps (comprendre recommandée la plupart du temps). Ensuite, j'imagine qu'une table normalisée est plus capable de supporter une modification de structure, étant donné que les informations ne sont pas dupliquées et qu'il n'y a pas de multiples liens entre les enregistrements. Cette logique de conception me parait primordiale.
 
La rapidité est aussi un facteur important, mais la dénormalisation des tables devrait toujours être fait avec précaution. Ce serait bien si tu pouvais faire des tests de montée en charge avec les deux maquettes. C'est long à faire, mais la différence de rapidité pourrait te permettre de faire le choix qui est le plus adapté. Je ne connais pas les gains classiques entre méthode 1 et 2. Cela doit pouvoir se trouver, même si j'ignore où.
 
Voilà mon petit avis. N'hésite pas à demander, si ce que je raconte n'est pas clair.


---------------
Le site de ma maman
Reply

Marsh Posté le 20-12-2002 à 01:15:26    

faut voir que dans la méthode 2 la jointure effectuee n'est pas bien méchante non plus.


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 20-12-2002 à 01:27:44    

sinon, la methode 1 est plus pratique pour afficher le nom du modo qui a fermé le topic (:d)...
alors que la methode 2 est meilleure quand le dernier posteur efface son message :)


---------------
(Feed-Back HFR) - Funky Tonight!
Reply

Marsh Posté le 20-12-2002 à 01:47:59    

Goueg a écrit :

sinon, la methode 1 est plus pratique pour afficher le nom du modo qui a fermé le topic (:d)...
alors que la methode 2 est meilleure quand le dernier posteur efface son message :)


tu peux très bien mettre une condition sur ta requète SQL ;)


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 20-12-2002 à 01:51:01    

sur laquelle de requête? [:figti]  
 
(tirage de vers du nez ON :d)


---------------
(Feed-Back HFR) - Funky Tonight!
Reply

Marsh Posté le 20-12-2002 à 01:51:01   

Reply

Marsh Posté le 20-12-2002 à 02:44:26    

Goueg a écrit :

sur laquelle de requête? [:figti]  
 
(tirage de vers du nez ON :d)

celle qui rappatrie les donnees des titres.
A la limite tu fais un :
 
IF(close=1,modo,dernier_auteur) dans ta requète :)


Message édité par joce le 20-12-2002 à 03:29:25

---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 20-12-2002 à 10:23:14    

merci tout le monde  :whistle:  
jvais m'y remettre :)

Reply

Marsh Posté le 20-12-2002 à 10:26:33    

Suri a écrit :

il vaut mieux:
- mettre a jour deux tables a chaque post
ou
- faire une sous requete?
 
j'explique...
prenons par ex le forum HFR [:titprem]
imaginons deux tables: une table_topic (contenant le nom du topic le posteur la date etc...) et une table_message (l'auteur, le texte etc...)
lorsque qqun poste un msg dans un topic (donc ds table_message), on peut voir sur la page de listing des topics son nom en tant que dernier posteur. (page generée grace a table_topic)
 
Pour cela, vaut il donc mieux, mettre a jour table_message (avec le corps du message, le nick etc..) ET la table_topic (modif du champ dernier_posteur)
ou
juste la table_message, sachant que pour la generation de la page topic, il y aurait une sousrequetes pour aller chercher le nom et la date du dernier post du topic?
 
 
j'espere que je suis assez clair.. c un brin confu encore ds mon esprit :D
 


 
Houlà !!!
 
Méthode 1 sans réfléchir !!!
Tu te rend compte du gain de perfs ?
 
Avec la méthode 2, tu dois exécuter autant de sous-requètes pour trouver le dernier posteur qu'il y a de topic affichés !!!
 
Sois une bonne 30aine !
 
Et sur un table "message" qui comporterai un bon million d'enreg... tes perfs vont s'ecrouler !!!
 
Par contre, ça t'oblige à maintenir le champs "dernier posteur" dans la table des topic.
Donc, ne pas oublier de la mettre à jours dans TOUS les cas (réponse, suppression du dernier message...).
 
Et il en vas de même beaucoup d'autres infos qui paraissent etre facilement récupérable par simple requète :
Le nombre de méssages postés depuis 00h00 par exemple.
Un simple SELECT te ramène ce nombre, mais c'est trop couteux sur une table de 500.000 message.
Il faut passer par un champs, incrémenter ce champ à chaque post et le remettre à zéro à 00h00.
 

Reply

Marsh Posté le 20-12-2002 à 10:28:51    

cyp en forsse a écrit :


Méthode 1 sans réfléchir !!!


 
Et en réfléchissant, tu prends laquelle ? :??:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 20-12-2002 à 10:45:34    

antp a écrit :


 
Et en réfléchissant, tu prends laquelle ? :??:


 
Ben... lis l'argumentaire au lieu d'essayer de faire de l'humour... :p

Reply

Marsh Posté le 20-12-2002 à 10:46:49    

Reply

Marsh Posté le 20-12-2002 à 12:43:54    

cyp en forsse a écrit :


 
Houlà !!!
 
Méthode 1 sans réfléchir !!!
Tu te rend compte du gain de perfs ?
 
Avec la méthode 2, tu dois exécuter autant de sous-requètes pour trouver le dernier posteur qu'il y a de topic affichés !!!
 


 
pas d'accord, t'as juste une seule jointure a faire.

Reply

Marsh Posté le 20-12-2002 à 12:51:03    

cyp en forsse a écrit :


 
Houlà !!!
 
Méthode 1 sans réfléchir !!!
Tu te rend compte du gain de perfs ?
 
Avec la méthode 2, tu dois exécuter autant de sous-requètes pour trouver le dernier posteur qu'il y a de topic affichés !!!
 
Sois une bonne 30aine !
 
Et sur un table "message" qui comporterai un bon million d'enreg... tes perfs vont s'ecrouler !!!
 
Par contre, ça t'oblige à maintenir le champs "dernier posteur" dans la table des topic.
Donc, ne pas oublier de la mettre à jours dans TOUS les cas (réponse, suppression du dernier message...).
 
Et il en vas de même beaucoup d'autres infos qui paraissent etre facilement récupérable par simple requète :
Le nombre de méssages postés depuis 00h00 par exemple.
Un simple SELECT te ramène ce nombre, mais c'est trop couteux sur une table de 500.000 message.
Il faut passer par un champs, incrémenter ce champ à chaque post et le remettre à zéro à 00h00.
 
 

:sarcastic:  
remets toi à tes bagnoles, toi, ça vaudra mieux.... :/


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 20-12-2002 à 13:04:15    

en fait il suffit de savoir que
- le rafraichissement de la page (liste des sujets) est sans doute l'action la plus fréquente
- l'ajout d'un message est moyennement fréquent  
- la suppression de message est rare
 
à partir de là je dirais que l'option 1 est mieux, même si la base n'est plus "normalisée".

Reply

Marsh Posté le 20-12-2002 à 13:07:20    

toute facon c'est assez evident :D
la methode 2 voudrait dire qu'il faut chopper le MAX du numero associe, donc faire un group by, etc etc :D

Reply

Marsh Posté le 20-12-2002 à 13:13:37    

maintenant est-ce mieux de stocker dans la table topic  
- l'id du dernier posteur, son nom, la date du dernier post  
ou
- stocker uniquement l'id du dernier message ? (on sait retrouver la date, le posteur, ...)
 
-> donc avoir une table optimisée ou méga optimisée ?

Reply

Marsh Posté le 20-12-2002 à 13:35:30    

joce a écrit :


 
pas d'accord, t'as juste une seule jointure a faire.


 
 :??:  
 
Une jointure sur quel champs ?
 
Dans la méthode 2, tu es bien obligé d'aller faire, par exemple, un SELECT MAX sur la date ou l'ID des messages pour sortir le dernier message du topic non ?
 

Reply

Marsh Posté le 20-12-2002 à 13:36:46    

--greg-- a écrit :

:sarcastic:  
remets toi à tes bagnoles, toi, ça vaudra mieux.... :/


 
T'es gentil, on parle technique ici.
Alors essaie de faire un effort pour suivre la discution et argumenter ou vas parler chiffon dans le topic bla-bla.
 

Reply

Marsh Posté le 20-12-2002 à 13:40:02    

ethernal a écrit :

maintenant est-ce mieux de stocker dans la table topic  
- l'id du dernier posteur, son nom, la date du dernier post  
ou
- stocker uniquement l'id du dernier message ? (on sait retrouver la date, le posteur, ...)
 


 
La solution de stocker l'id du dernier posteur n'est pas bonne, parceque tu ne serais pas retrouver le dernier message (dans le cas ou ce posteur aurait posté une autre réponse dans un autre topic).
 
Tu stock juste l'ID du dernier message.
 
Puis tu fais un JOIN pour récupérer l'ID du posteur et un autre imbriqué pour récupérer son pseudo !

Reply

Marsh Posté le 20-12-2002 à 13:51:12    

cyp en forsse a écrit :


 
La solution de stocker l'id du dernier posteur n'est pas bonne, parceque tu ne serais pas retrouver le dernier message (dans le cas ou ce posteur aurait posté une autre réponse dans un autre topic).
 
Tu stock juste l'ID du dernier message.
 
Puis tu fais un JOIN pour récupérer l'ID du posteur et un autre imbriqué pour récupérer son pseudo !


oui bon ok j'aurais du dire :
- l'id du dernier message, l'id du dernier posteur, la date du dernier post, le nom du dernier posteur.
ou
- l'id du dernier message
 
je pensais que tout le monde l'aurais compris  :ange:

Reply

Marsh Posté le 20-12-2002 à 13:55:09    

cyp en forsse a écrit :


 
 :??:  
 
Une jointure sur quel champs ?
 
Dans la méthode 2, tu es bien obligé d'aller faire, par exemple, un SELECT MAX sur la date ou l'ID des messages pour sortir le dernier message du topic non ?
 
 

jointure sur le champ numeropost
 
tu fais un  
 
SELECT pseudo, titre_topic, ..., MAX(date) as a FROM titre,topic WHERE titre.numeropost=topic.numeropost GROUP BY numeropost ORDER BY a DESC LIMIT 0,30;
 
C'est bien horrible comme query ceci dit :D


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 20-12-2002 à 13:55:13    

ethernal a écrit :


je pensais que tout le monde l'aurais compris  :ange:  

T'inquiète. On avait tous compris. :jap:


---------------
Le site de ma maman
Reply

Marsh Posté le 20-12-2002 à 13:58:46    

ethernal a écrit :


oui bon ok j'aurais du dire :
- l'id du dernier message, l'id du dernier posteur, la date du dernier post, le nom du dernier posteur.
ou
- l'id du dernier message
 
je pensais que tout le monde l'aurais compris  :ange:  


 
Quel interet de mettre l'ID du dernier posteur ? tu vas de toute façon devoir faire des join pour récupérer les pseudo et la date.
L'ID du dernier message suffit.
 
Ou alors, si tu veux eviter les JOIN (couteux en temps) tu peux stocker la totale : ID de posteur, pseudo du posteur, ID du dernier message et Date du dernier message.
Mais c'est dommage de mettre tout ça et d'alourdir autant la table des topic qui est la plus sollicitée.
 
Sinon, pour le "je pensais que tout le monde l'aurais compris  :ange: " tu peux te le mettre ou je pense.
C'est déjà pas simple de correctement répondre aux questions, mais si en plus il faut deviner les oublis dans les formulations des questions, c'est plus de l'informatique, c'est du spiritisme.

Reply

Marsh Posté le 20-12-2002 à 14:05:45    

joce a écrit :

jointure sur le champ numeropost
 
tu fais un  
 
SELECT pseudo, titre_topic, ..., MAX(date) as a FROM titre,topic WHERE titre.numeropost=topic.numeropost GROUP BY numeropost ORDER BY a DESC LIMIT 0,30;
 


 
Ton MAX, dans ce cas, c'est une sous-requète.
Je vois pas pourquoi tu parle de jointure.
 

Reply

Marsh Posté le 20-12-2002 à 14:07:39    

cyp en forsse a écrit :

T'es gentil, on parle technique ici.


ah bon  :??:  
 
kestuféla alors ? je croyais que t'étais en train d'étudier sérieusement l'asm moi, parce que vu ta seule réponse à un topic parlant d'assembleur, je me dis effectivement qu'il y a un mois, tu savais pas ce que c'est un compilo !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-12-2002 à 14:08:36    

Cherrytree a écrit :

T'inquiète. On avait tous compris. :jap:  


 
Vu la qualité de ta seul contribution à ce sujet (20 ligne pour rien dire et ne pas répondre à une problèmatique pourtant trés simple à évaluer) je m'abstiendrais de tout commentaire.
 
 
 

Reply

Marsh Posté le 20-12-2002 à 14:12:01    

cyp en forsse a écrit :


 
T'es gentil, on parle technique ici.
Alors essaie de faire un effort pour suivre la discution et argumenter ou vas parler chiffon dans le topic bla-bla.
 
 

[:blandine]


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 20-12-2002 à 14:12:39    

cyp en forsse a écrit :


 
Ton MAX, dans ce cas, c'est une sous-requète.
Je vois pas pourquoi tu parle de jointure.
 
 

non c'est pas une sous-requète.
 
Et la jointure est là : titre.numeropost=topic.numeropost.
 
Une sous requete c'est ca :
 
SELECT pseudo, titre_topic, ..., numeropost as a, (SELECT MAX(date) FROM topic WHERE numeropost=a) as b FROM titre ORDER BY b DESC LIMIT 0,30;


Message édité par joce le 20-12-2002 à 14:15:44

---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 20-12-2002 à 14:12:47    

Harkonnen a écrit :


ah bon  :??:  
 
kestuféla alors ? je croyais que t'étais en train d'étudier sérieusement l'asm moi, parce que vu ta seule réponse à un topic parlant d'assembleur, je me dis effectivement qu'il y a un mois, tu savais pas ce que c'est un compilo !


 
 :p  
 
Tiens, voilà le dieux de l'ASM.
Masi souvenir d'asm sont lointaint, mais les tiens n'ont pas l'air trés frais non plus.
Pour le "byte" j'avais faux, mais tu aurais pu dire à notre élève que cette syntaxe s'accompagne de "ptr" pour obliger le compilo à ne charger que l'octet de poid faible dans une variable 16 bit ou dans un registre, vu que tu sais tout.
 
Tiens, si tu veux vraiment m'etonner, rappelle moi comment on passe du mode réel au mode protégé en asm 80386  :p  (je sais, c'est pas jeune, mais je me suis arreté il y a longtemps).

Reply

Marsh Posté le 20-12-2002 à 14:16:48    

cyp en forsse a écrit :


 
Ton MAX, dans ce cas, c'est une sous-requète.Je vois pas pourquoi tu parle de jointure.
 
 


Pourrais tu éclairer ma lanterne et m'expliquer ce que tu appelle sous-requête, parceque manifestement je ne dois pas avoir la même définition ?


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 20-12-2002 à 14:17:12    

joce a écrit :

non c'est pas une sous-requète.
 
Et la jointure est là titre.numeropost=topic.numeropost.
 
Une sous requete c'est ca :
 
SELECT pseudo, titre_topic, ..., numeropost as a, (SELECT MAX(date) FROM topic WHERE numeropost=a) as b FROM titre ORDER BY b DESC LIMIT 0,30;  


 
Oui, dans la syntaxe, ceci est bien une sous requète.
Mais de toute façon, un MAX, c'est une requète ! dans les faits, ton SGBD va faire une requète pour te sortir le max.

Reply

Marsh Posté le 20-12-2002 à 14:19:58    

tomlameche a écrit :


Pourrais tu éclairer ma lanterne et m'expliquer ce que tu appelle sous-requête, parceque manifestement je ne dois pas avoir la même définition ?


 
Une sous requète est une requète dans une requete, mais ça, tu dois le savoir.
Maintenant, quand, dans une requète SELECT, tu spécifie un MAX sur un des champs selectionné, ton SGDB va réaliser une autre requète pour se positionner sur l'enreg demandé. Puis il va te sortir les champs spécifiés dans le SELECT.
 
Ben, ça, typiquement, c'est une sous-requète.

Reply

Marsh Posté le 20-12-2002 à 14:22:05    

cyp en forsse a écrit :


 
Oui, dans la syntaxe, ceci est bien une sous requète.
Mais de toute façon, un MAX, c'est une requète ! dans les faits, ton SGBD va faire une requète pour te sortir le max.

ca n'a rien à voir, utilise les termes adéquats.
Le premier cas necessite une jointure entre les deux tables, tandis que le deuxième cas se base sur un dependent SUBSELECTs qui va crée une table temporaire en interne (ceci dit la premiere requete va generer aussi une table temporaire pour pouvoir faire l'order by).
Mais les deux requètes n'ont pour moi rien à voir.


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 20-12-2002 à 14:23:08    

cyp en forsse a écrit :


 
Une sous requète est une requète dans une requete, mais ça, tu dois le savoir.
Maintenant, quand, dans une requète SELECT, tu spécifie un MAX sur un des champs selectionné, ton SGDB va réaliser une autre requète pour se positionner sur l'enreg demandé. Puis il va te sortir les champs spécifiés dans le SELECT.
 
Ben, ça, typiquement, c'est une sous-requète.


tu ne connais pas le fonctionnement interne de la SGBD pour avancer ca. Un MAX n'est PAS une sous-requète.


---------------
Protèges carnets personnalisés & accessoires pour bébé
Reply

Marsh Posté le 20-12-2002 à 14:31:39    

joce a écrit :


tu ne connais pas le fonctionnement interne de la SGBD pour avancer ca. Un MAX n'est PAS une sous-requète.


 
Pas d'accord.
 
Je vais pas t'aprendre le principe d'une requète quand même !
 
Dans le cas qui nous interesse :  
 
1er requète : récuperer le jeux d'enreg de la table message qui satisfait la condition "appartient au topic".
 
2eme requète sur ce même jeux : récuperer celui qui a la date la plus récente.
 
Ensuite, tu peux formuler ta requète comme tu veux, dans le principe, tu fais une sous-requète.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed