Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2982 connectés 

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  405  406  407  ..  486  487  488  489  490  491
Auteur Sujet :

les développeurs de forums, les 3/4 des forums sont down /o\

n°1406962
fabien
Vive la super 5 !
Posté le 14-07-2006 à 16:04:32  profilanswer
 

Reprise du message précédent :

gizmo a écrit :

Va jouer au bac à sable.  
 
Ou si tu veux grandir un peu, va regarder de quoi sont capables les systèmes d'internationalisation comme gettext, tu verras que c'est nettement plus évolué qu'un bête vecteur.


pas la peine de me parler avec autant d'arogance  :heink:  :sarcastic:  
 
Et est ce bien optimisé ta metode avec gettext?  :sarcastic:  
car je ne vois pas plus simple et plus leger qu'un tableau contenant les phrases à traduire.


Message édité par fabien le 14-07-2006 à 16:05:03

---------------
Découvre le HFRcoin ✈ - smilies
mood
Publicité
Posté le 14-07-2006 à 16:04:32  profilanswer
 

n°1406963
gizmo
Posté le 14-07-2006 à 16:06:21  profilanswer
 

gettext, c'est du compilé, ca gére les pluriels, les différences constructions linguistiques et l'insertions de variables.

n°1406969
anthomicro
Posté le 14-07-2006 à 16:29:30  profilanswer
 

anthomicro a écrit :


Bref en gros le principe est simple (dur à expliquer mais tout simple une fois qu'on a compris le principe).
 
Tu rajoutes un champ dans ta table "topics" (et aussi pour ta table "posts" pour que l'affichage d'un topic se fasse sur la même base que l'affichage de la liste des topics). Ce champ variera de 0 à n topics (n est le nombre de topics). Le n le plus grand sera pour le topic le plus ancien, et 0 sera pour le topic le plus récent. A chaque rajout de topic, tu incrémentes le champ "id_class" (je l'ai appelé comme ça dans mon forum) de 1 pour tous les topics de la rubrique en cours (si tu réponds dans un topic, tu fais passer l'id_class du sujet en cours à 0 et les autres qui avaient un id_class inférieur au topic en cours tu rajoutes +1)
 
Quand tu affiches une page, tu fais un WHERE id_class BETWEEN X AND Y  
 
X c'est 0+nb_topics_par_page*page_en_cours
 
et Y c'est X + nb_topics_par_page


n°1406989
Pc_eXPert
Posté le 14-07-2006 à 17:32:33  profilanswer
 

anthomicro a écrit :

Optimiser MySQL (j'ai fait un article là dessus, sinon j'ai expliqué une solution possible dans ce topic y'a pas mal de pages ;) )
 
Je précise que ce n'est qu'un exemple de solution, il y en a certainement d'autres, je mets au moins la mienne...


Merci, j'y ai jeté un coup d'oeil... le between marche bien, mais le problème est que si 5 posts sont supprimés, il y aura 5 posts de moins sur la page correspondante :/
 
Un truc qui m'a choqué:

Citation :

De nombreux forums (payants ou gratuits) tel que PHPBB ou encore IPB,[...]. Le problème de ces forums est qu'ils utilisent pour sélectionner une tranche de topics (ou de messages) la clause LIMIT dans leurs requêtes MySQL (mal conçues).


IPB utilise IN (justement, c'est pourquoi je cherche à faire pareil)
Si tu veux vérifier, cherche un forum qui active le debugging, tu verras les requêtes ;)

n°1406997
anthomicro
Posté le 14-07-2006 à 17:46:15  profilanswer
 

Ils ont dû changer de méthode depuis, je vais installer IPB et je te dis ensuite ;)
 
EDIT : j'affiche un forum :  
 

SELECT * FROM ipb_topics t WHERE t.forum_id=2 AND t.pinned IN (0,1) and t.approved IN (0,1) ORDER BY t.pinned DESC, t.last_post DESC LIMIT 0,30


 
J'affiche un topic :
 

SELECT pid,topic_id FROM ipb_posts WHERE topic_id=1 ORDER BY pid asc LIMIT 0,20


 
Y'a encore des progrès à faire  :whistle:

Message cité 1 fois
Message édité par anthomicro le 14-07-2006 à 17:54:30
n°1407005
Pc_eXPert
Posté le 14-07-2006 à 17:58:09  profilanswer
 

anthomicro a écrit :

Ils ont dû changer de méthode depuis, je vais installer IPB et je te dis ensuite ;)
 
EDIT : j'affiche un forum :  
 

SELECT * FROM ipb_topics t WHERE t.forum_id=2 AND t.pinned IN (0,1) and t.approved IN (0,1) ORDER BY t.pinned DESC, t.last_post DESC LIMIT 0,30


 
J'affiche un topic :
 

SELECT pid,topic_id FROM ipb_posts WHERE topic_id=1 ORDER BY pid asc LIMIT 0,20


 
Y'a encore des progrès à faire  :whistle:


Quelle version ?

n°1407008
MS-DOS_199​1
www.newbie-project.net
Posté le 14-07-2006 à 18:04:56  profilanswer
 

Citation :

A chaque rajout de topic, tu incrémentes le champ "id_class" (je l'ai appelé comme ça dans mon forum) de 1 pour tous les topics de la rubrique en cours (si tu réponds dans un topic, tu fais passer l'id_class du sujet en cours à 0 et les autres qui avaient un id_class inférieur au topic en cours tu rajoutes +1)


C'est lourd, non ?

Message cité 1 fois
Message édité par MS-DOS_1991 le 14-07-2006 à 18:05:57

---------------
Viendez sur le Newbie-Project et essayez le Newbie-Directory (nouveau)
n°1407010
anthomicro
Posté le 14-07-2006 à 18:09:40  profilanswer
 

Pc_eXPert a écrit :

Quelle version ?


 
2.1.6 (la 2.1.7 ne corrige que des failles)
 

MS-DOS_1991 a écrit :

Citation :

A chaque rajout de topic, tu incrémentes le champ "id_class" (je l'ai appelé comme ça dans mon forum) de 1 pour tous les topics de la rubrique en cours (si tu réponds dans un topic, tu fais passer l'id_class du sujet en cours à 0 et les autres qui avaient un id_class inférieur au topic en cours tu rajoutes +1)


C'est lourd, non ?


 
Non car généralement tu n'updates pas beaucoup de topics ;)

n°1407012
MS-DOS_199​1
www.newbie-project.net
Posté le 14-07-2006 à 18:14:37  profilanswer
 

Moi pas comprendre :cry:  :cry:  
 
"rubrique", pour toi, c'est "forum" ?


---------------
Viendez sur le Newbie-Project et essayez le Newbie-Directory (nouveau)
n°1407018
rosco
Posté le 14-07-2006 à 18:23:23  profilanswer
 

Pc_eXPert a écrit :

Quelle version ?


Je viens de vérifier aussi, ça me semblait bien louche qu'ils aient changé.  
Avec une 2.1.4, mêmes requêtes que Anthomicro avec un LIMIT classique. La majorité du forum en V2 est similaire au 1.3 au niveau de la gestion des requêtes SQL, tout le reste autour a été alourdi. Y a bien des requêtes avec un IN() mais c'est pour les attachements par exemple. C'est pas grave, leur système de cache pallie à la lenteur de la requête :whistle:

Message cité 2 fois
Message édité par rosco le 14-07-2006 à 18:24:24
mood
Publicité
Posté le 14-07-2006 à 18:23:23  profilanswer
 

n°1407021
anthomicro
Posté le 14-07-2006 à 18:28:00  profilanswer
 

MS-DOS_1991 a écrit :

Moi pas comprendre :cry:  :cry:  
 
"rubrique", pour toi, c'est "forum" ?


 
En parlant d'ipb quand je dis que je consulte un forum oui c'est une rubrique ;) il est vrai que je dis normalement "forum" au sens du terme général, mais bon j'avais voulu reprendre les termes utilisés par IPB.
 

rosco a écrit :

C'est pas grave, leur système de cache pallie à la lenteur de la requête :whistle:


 
Heu  :whistle:  

n°1407023
MS-DOS_199​1
www.newbie-project.net
Posté le 14-07-2006 à 18:30:20  profilanswer
 

anthomicro a écrit :

En parlant d'ipb quand je dis que je consulte un forum oui c'est une rubrique ;) il est vrai que je dis normalement "forum" au sens du terme général, mais bon j'avais voulu reprendre les termes utilisés par IPB.

Ok :whistle:


---------------
Viendez sur le Newbie-Project et essayez le Newbie-Directory (nouveau)
n°1407033
Pc_eXPert
Posté le 14-07-2006 à 18:56:23  profilanswer
 

rosco a écrit :

Je viens de vérifier aussi, ça me semblait bien louche qu'ils aient changé.  
Avec une 2.1.4, mêmes requêtes que Anthomicro avec un LIMIT classique. La majorité du forum en V2 est similaire au 1.3 au niveau de la gestion des requêtes SQL, tout le reste autour a été alourdi. Y a bien des requêtes avec un IN() mais c'est pour les attachements par exemple. C'est pas grave, leur système de cache pallie à la lenteur de la requête :whistle:


Je l'ai sûrement rêvé alors :D
 
Tu as mieux que LIMIT  (BETWEEN pose problème en cas de suppression) ?
Car récupérer toutes les IDs d'une page et les mettre dans un IN, ça me parait compliqué :ouch:

n°1407057
rosco
Posté le 14-07-2006 à 19:42:31  profilanswer
 

Pc_eXPert > Je peux montrer ma méthode si tu veux, c'est implémentable partout sans s'embêter. Personnellement, j'utilise un LIMIT un peu modifié et c'est Joce qui avait suggéré la même chose un peu plus haut dans ce topic. Avec mes tests (IPB 1.3 très nettoyé et modifié), c'est 100-200+% de mieux que le simple LIMIT utilisé par IPB par exemple (+ le topic est gros, + on gagne en fait, même si ça ralentit quand même à force), mais ça repousse ma limite de découpe des topics pour alléger. Le BETWEEN est très intéressant et sera p/e implementé dans le futur, mais c'est effectivement un peu + chiant à gérer surtout avec le DELETE.
 
EDIT : j'ai retrouvé la requête originale pour visualiser les replys dans un topic pour IPB. La requête de base est celle-là :

Code :
  1. //méthode originale IPB avec ORDER+LIMIT bourrins
  2. $DB->query( "SELECT p.*, m.id,m.name,m.mgroup,m.email,m.joined,m.avatar,m.avatar_size,m.posts,m.aim_name,m.icq_number,
  3. m.signature, m.website,m.yahoo,m.integ_msg,m.title,m.hide_email,m.msnname, m.warn_level, m.warn_lastwarn, g.g_id, g.g_title, g.g_icon, g.g_dohtml $join_get_fields
  4. FROM ibf_posts p
  5. LEFT JOIN ibf_members m ON (p.author_id=m.id)
  6. LEFT JOIN ibf_groups g ON (g.g_id=m.mgroup)
  7. $join_profile_query
  8. WHERE p.topic_id=".$this->topic['tid']." and p.queued != 1
  9. ORDER BY p.{$ibforums->vars['post_order_column']} {$ibforums->vars['post_order_sort']}
  10. LIMIT $first, ".$ibforums->vars['display_max_posts']);


La mienne (ancienne version) a été nettoyée et j'ai viré ce qu'y ne sert pas par rapport à celle du dessus :

Code :
  1. //méthode originale avec ORDER+LIMIT bourrins mais nettoyée
  2. $DB->query( "SELECT p.pid, p.append_edit, p.edit_time, p.author_id, p.author_name, p.use_sig, p.use_emo, p.ip_address, p.post_date, p.icon_id, p.post, p.topic_id, p.forum_id, p.new_topic,
  3. p.edit_name, m.id, m.name, m.mgroup, m.email, m.avatar, m.avatar_size, m.posts, m.signature, m.website, m.title, m.hide_email, m.configuration
  4. FROM ibf_posts p
  5. LEFT JOIN ibf_members m ON (p.author_id=m.id)
  6. WHERE p.topic_id=".$this->topic['tid']."
  7. ORDER BY p.{$ibforums->vars['post_order_column']} {$ibforums->vars['post_order_sort']}
  8. LIMIT $first, ".$ibforums->vars['display_max_posts']);


 
Le problème avec cette seule requête, dont la structure est commune à un très grand nombre de forum, c'est que l'ORDER va devoir trier un très gros volume de données (il rapatrie tout ce qui fait référence au topic en question) avant de piocher un certain nombre de données avec le LIMIT. Or ça bouffe un temps fou de faire ça car plus le topic contient de replys, plus le volume à traiter est énorme et plus la requête va morfler.
 
Le but est donc de scinder ça en 2 requêtes + petites et + légères.
 
La 1ère récupére uniquement les ID des replys qu'on doit afficher en utilisant un ORDER et un LIMIT, mais on ne travaille que sur des ID numériques donc le volume a traiter et à ordonner est bien plus faible, la requête va bien plus vite (même si elle reste coûteuse quand le topic enfle beaucoup car la liste d'ID à trier s'allonge...) :

Code :
  1. //methode 2 : on ne va chercher qu'un certain nombre d'ID triés (25 si la page contient 25 replys)
  2. $DB->query("SELECT p.pid
  3. FROM ibf_posts p
  4. WHERE p.topic_id=".$this->topic['tid']."
  5. ORDER BY p.{$ibforums->vars['post_order_column']} {$ibforums->vars['post_order_sort']}
  6. LIMIT $first, ".$ibforums->vars['display_max_posts'] );


Là où ça différe avec Joce, c'est que moi je ne créé pas une TEMPORARY TABLE pour stocker ces ID et utiliser cette table dans la 2ème requête en temps qu'INDEX (avec un USING() ) car créer une TEMPORARY TABLE ça prend du temps (~0.09 sec sur ma machine locale y me semble sans optis particulières ). Ca ne ramène de toute façon rien d'intéressant de mon point de vue car la méthode de la table temporaire reste toujours plus lente que ce qui suit. Donc je mets tout simplement cette liste d'ID dans une chaîne de caractères entre virgules pour l'injecter dans la 2ème requête, c'est + rapide :

Code :
  1. //On met les ID des replys à afficher dans une chaine pour l'envoyer dans la requête suivante
  2. $idreplys = array();
  3. while ($row = $DB->fetch_row()) {$idreplys[] = $row['pid'];}
  4. $idreplys = implode(",",$idreplys);


Il ne reste plus qu'à aller chercher toutes les données utiles uniquement des X replys qu'on veut afficher et dont on connait maintenant les ID. On n'a plus rien à trier ou à piocher puisque la liste d'ID est déjà dans l'ordre choisi, la 2ème requête est quasi instantanée ici, la + gourmande est de très loin la 1ère (95% du temps total d'éxécution des 2 requêtes présentées). J'utilise un IN() pour ne piocher que ce qui m'intéresse dans la table des replys (les ID ne se suivent pas donc pas de BETWEEN possible...). Attention aussi à faire un test sur le contenu qu'on envoit au IN() car s'il la chaîne est vide, MySQL renvoit une erreur, normal... Donc là si la chaine est vide, c'est qu'on vient de DELETE le dernier reply de la page en cours, on fait donc un saut pour aller chercher la routine d'affichage du dernier reply du topic. La 2ème requête qui va chercher les data pour l'affichage :

Code :
  1. $DB->query( "SELECT p.pid, p.append_edit, p.edit_time, p.author_id, p.author_name, p.use_sig, p.use_emo, p.ip_address, p.post_date, p.icon_id, p.post, p.topic_id, p.forum_id, p.new_topic,
  2. p.edit_name, m.id, m.name, m.mgroup, m.email, m.avatar, m.avatar_size, m.posts, m.signature, m.website, m.title, m.hide_email, m.configuration
  3. FROM ibf_posts p
  4. LEFT JOIN ibf_members m ON (p.author_id=m.id)
  5. WHERE p.pid IN (".$idreplys." )" );


Au final, j'y gagne nettement en temps de génération et la différence se voit bien (test jusqu'à 200000 replys dans un seul topic) ! Alors oui on a 2 requêtes au lieu d'1, mais on bouffe bien moins de ressources globalement. Donc en attendant de passer à une méthode + optimisée @la BETWEEN par exemple (ou un autre truc à définir suivant les différents problèmes que ça engendre), ça en restera là pour l'instant pour moi. On fait un SPLIT des gros topics à 1000 pages environ à la main car les énormes topics ne sont pas légion dans mon cas et ça ne pose aucun souci :jap:


Message édité par rosco le 15-07-2006 à 01:56:07
n°1407062
Pc_eXPert
Posté le 14-07-2006 à 20:00:30  profilanswer
 

Merci ça semble efficace.. Je vais essayer de l'implémenter (si je trouve une solution avec le between, MP)
 
Merci encore :jap:

n°1407086
anthomicro
Posté le 14-07-2006 à 21:06:00  profilanswer
 

C'est toujours mieux que rien en effet ;)

n°1407115
Pc_eXPert
Posté le 15-07-2006 à 00:57:33  profilanswer
 

Rosco> Ta solution fonctionne :) Il faut par contre utiliser mysql_fetch_array() (ou assoc()) à la place de mysql_fetch_row(), puisque tu utilises la valeur associative dans ta variable(array) $row :D
 
Nota: je suis pas HS, je code ma board ( :o ) IPB est juste une source d'inspiration parmi tant d'autres, c'est tout :D
 
Merci à vous en tout cas :jap:


Message édité par Pc_eXPert le 15-07-2006 à 00:58:37
n°1407119
rosco
Posté le 15-07-2006 à 01:08:31  profilanswer
 

T'as fais des tests comparatifs ? :o

n°1407120
scull
MySCULL cay bon mangez en!
Posté le 15-07-2006 à 01:09:03  profilanswer
 

Alors avec vos histoire de non utilisation de limit, ça m'a donné envie d'améliorer mon bouzin ^^
 
Je vous le montre dés que il devient montrable :jap:
En tout cas je gagne déjà 3ms sur un topic qui en met 24 à l'origine ^^
 
Anthomicro, la premiere fois que j'ai refait le code de mon forum pour l'optimiser, c'était grace à ton tuto sur phpnet (hébergeur php merdique)
http://www.phpnet.org/forum/index. [...] 975.0.html D'ailleur j'adore ta signature sur ce forum ;)

Message cité 1 fois
Message édité par scull le 15-07-2006 à 01:22:26
n°1407131
Pc_eXPert
Posté le 15-07-2006 à 01:56:38  profilanswer
 

rosco a écrit :

T'as fais des tests comparatifs ? :o


Même pas la peine de chercher un temps en secondes précis: on le voit de suite :D
J'ai fait une loop pour avoir ~15 000 pages (:D) et y'a pas photo: la seconde solution (IN) est largement plus rapide :D
Mais quand même: 8,601 s de moyenne (15 essais) avec le IN, 14,679 s de moyenne avec Limit (15 essais)
 
Par contre j'ai pas compris l'utilisation mémoire du serveur: 285376 avec le limit contre 288048 avec IN :heink: (fonction memory_get_usage())
 
Sinon je réfléchis à une autre solution pour se débarasser définitivement du LIMIT. Si je trouve une solution fonctionnelle mais surtout interessante niveau perfs, il est évident que je vous en ferez part :D

n°1407132
rosco
Posté le 15-07-2006 à 02:03:16  profilanswer
 

Chez moi, le ratio entre le temps pour IN() et celui pour LIMIT atteignait 3 pour 200000 messages. J'ai pas vérifié au niveau mémoire ce que ça engendrait chez moi, jamais regardé ces fonctions de toute façon. T'es sûr que ça représente uniquement le "poids" de la requête et pas une utilisation + globale avec des choses qui restent en mémoire (variables détruites en fin de requête pour faire de la place ?). A vue de nez, la 2ème soluce devrait pourtant être un peu + légère :??: , faudrait voir en interne comment MySQL gère ce dont il a besoin dans les 2 cas...

Message cité 1 fois
Message édité par rosco le 15-07-2006 à 02:07:13
n°1407133
Pc_eXPert
Posté le 15-07-2006 à 02:13:51  profilanswer
 

rosco a écrit :

Chez moi, le ratio entre le temps pour IN() et celui pour LIMIT atteignait 3 pour 200000 messages. J'ai pas vérifié au niveau mémoire ce que ça engendrait chez moi, jamais regardé ces fonctions de toute façon. T'es sûr que ça représente uniquement le "poids" de la requête et pas une utilisation + globale avec des choses qui restent en mémoire (variables détruites en fin de requête pour faire de la place ?). A vue de nez, la 2ème soluce devrait pourtant être un peu + légère :??: , faudrait voir en interne comment MySQL gère ce dont il a besoin dans les 2 cas...


En effet, je prends en compte le temps de chargement intégral de la page, et pas uniquement la requête ;)
De plus, ça varie entre 5 et 10 pour le IN selon les refresh :D (serveur local un peu fatigué).
 
edit: d'ailleurs, pourrais-tu me dire comment calculer uniquement le temps d'éxecution de la requête sql ? (là j'ai utilisé le classique microtime())


Message édité par Pc_eXPert le 15-07-2006 à 02:15:23
n°1407135
rosco
Posté le 15-07-2006 à 02:17:24  profilanswer
 

D'ailleurs la fonction pour la mémoire c'est pour voir ce que PHP pompe en un temps donné donc le poids des variables notamment, pas pour MySQL durant son traitement (et là ça devrait être + léger avec le IN()). C'est donc normal d'avoir quasi la même chose puisque le résultat final est identique au niveau de ce que contiennent les variables.  
Mon ratio c'est aussi le temps de génération total de la page, mais ça se retrouvait en faisant les requêtes à la main aussi (dans phpmyadmin, y donne le temps directement).


Message édité par rosco le 15-07-2006 à 02:20:21
n°1407138
Pc_eXPert
Posté le 15-07-2006 à 02:31:37  profilanswer
 

ok ok :D
 
J'en suis à 4,947 s contre 40,116 s pour 43009 pages  
 Apparemment, le gain est exponentiellement fonction du nombre de pages :D
Mais là, la différence me parait énorme. (bon aussi le limit doit traiter 43K+ pages donc bon)
 
Bref c'est mieux anyway...
 
 
et OK pour la mémoire :D

n°1407144
anthomicro
Posté le 15-07-2006 à 05:33:35  profilanswer
 

scull a écrit :

Alors avec vos histoire de non utilisation de limit, ça m'a donné envie d'améliorer mon bouzin ^^
 
Je vous le montre dés que il devient montrable :jap:
En tout cas je gagne déjà 3ms sur un topic qui en met 24 à l'origine ^^
 
Anthomicro, la premiere fois que j'ai refait le code de mon forum pour l'optimiser, c'était grace à ton tuto sur phpnet (hébergeur php merdique)
http://www.phpnet.org/forum/index. [...] 975.0.html D'ailleur j'adore ta signature sur ce forum ;)


 
Oui le censeur de PHPPROUT (Thibaud et Alex le boulet aussi) m'ont bannis plusieurs fois les nazes ^^ donc bon j'ai changé ma signature (chose encore possible) mais ils n'ont toujours pas grillé  :lol:  
 
Bref sinon pour le tuto mieux vaut suivre le nouveau que j'ai fait sur vulgarisation intitulé "optimiser MySQL". C'est plus détaillé et plus juste ;)

n°1407165
rosco
Posté le 15-07-2006 à 11:12:47  profilanswer
 

Pc_eXPert a écrit :

Apparemment, le gain est exponentiellement fonction du nombre de pages :D


Oui c'est ce que j'avais précisé, le volume de données dans les 2 cas n'augmentent pas de la même manière, celui du 2ème cas augmente "très doucement". Mais bon 4 s c'est mieux que 40 c'est sûr, mais ça reste beaucoup trop en "production" si jamais on a des gros topics (faut bien voir qu'il n'y aura pas qu'une seule requête à la fois sur un vrai forum). Vivement un BETWEEN à 0.1-0.2 s tout le temps quelle que soit la page :ange:

n°1407304
anthomicro
Posté le 15-07-2006 à 22:12:56  profilanswer
 

rosco a écrit :

Vivement un BETWEEN à 0.1-0.2 s tout le temps quelle que soit la page :ange:


 
Avec IPB c'est pas demain la veille  :whistle:

n°1407332
scull
MySCULL cay bon mangez en!
Posté le 15-07-2006 à 23:40:31  profilanswer
 

Dans le cas ou MYSQL fait bien son boulot et que les enregistrements sont bien fais l'un aprés l'autre, on doit pouvoir faire sauter le ORDER BY qui visiblement est le seul ralentissement de la requète non ?
D'ailleur pourquoi il arrive que mysql enregistre en vrac des fois ?

n°1407350
rosco
Posté le 16-07-2006 à 00:07:16  profilanswer
 

Oui le ORDER plombe bien (suffit de le virer pour le voir), mais sans ça, ça arrive dans n'importe quel ordre (ordre qui peut d'ailleurs être changé par l'utilisateur sur certains forums s'il en a envie...). C'est un peu con mais c'est comme ça. Je ne sais pas quel critère "automatique" est pris par Mysql pour rapatrier sans le ORDER, c'est pas aléatoire car le résultat final est toujours le même. Y a forcément un ordre d'arrivée préférentiel dans son truc, mais je ne trouve pas de logique spécifique dans ce que j'ai pu testé en comparant ce qu'il rapatrie. Le LIMIT a aussi une bonne part de responsabilité dans le temps mis par la requête (on voit bien la différence de temps qui grimpe entre la 1ère page et la dernière page sans le ORDER, juste avec un LIMIT) et donc la conjonction des 2 donne un truc infâme  :D  
 
Tu nous présentes quand ta méthode Scull ? :o
 
D'ailleurs j'ai aussi vu dans le post 1 que Max Evans, qui ne poste plus depuis des années dans ce topic, utilise surement une très bonne méthode car en faisant le tour de son forum Liteboard, les gros topics sont quasi instantanés comme ici (500 pages)...

Message cité 1 fois
Message édité par rosco le 16-07-2006 à 00:12:44
n°1407358
Pc_eXPert
Posté le 16-07-2006 à 00:26:20  profilanswer
 

rosco a écrit :

Oui c'est ce que j'avais précisé, le volume de données dans les 2 cas n'augmentent pas de la même manière, celui du 2ème cas augmente "très doucement". Mais bon 4 s c'est mieux que 40 c'est sûr, mais ça reste beaucoup trop en "production" si jamais on a des gros topics (faut bien voir qu'il n'y aura pas qu'une seule requête à la fois sur un vrai forum). Vivement un BETWEEN à 0.1-0.2 s tout le temps quelle que soit la page :ange:


Ouais pour ça il faudrait d'abord récupérer les IDs manquantes et ajouter d'autant la fin du Between (ça doit pouvoir se faire, quand même)

anthomicro a écrit :

Avec IPB c'est pas demain la veille  :whistle:


Déjà dit que j'utilisais pas IPB :o
Je prends des idées sur IPB [:cbrs]

n°1407360
0x90
Posté le 16-07-2006 à 00:28:33  profilanswer
 

Une petite idée d'optim en passant, elle pose quelques contraintes mais supportables :
 
- On limite les possibilités qu'a le choix de l'utilisateur en terme de nombre de posts par page, par exemple 10, 20, 50. L'important étant que le nombre minimal ne soit pas trop-faible (plus il est gros, plus grand sera le gain ;)) et que les autres soient des multiples de celui-ci.
 
- On rajoute un champ dans la table des messages nommées "Page", qui stoque donc le numéro de la page. (on garde evidemment toujours un id de message dans le topic)
 
- Quand quelqu'un utilise le nombre de post par page minimal, il suffit de rapattrier les posts qui ont comme n° de page celui demandé, puis de trier par id de message. ( récupération sans tri de 10 messages, puis tri de ceux-ci, une opération rapide :D)
 
- Quand quelqu'un utilise un nombre de posts par page supérieur (par exemple 50), on demande les posts dont le champ Page est entre n/5 et n/5+5, puis on les trie. ( pareil que le précedent, ca reste aussi rapide :D)
 
Le truc un peu plus dur c'est quand on supprime un message, mais la, rien de vraiment dramatique. On décrémente le champ Page de tout les messages qui sont les premiers avec une certaine valeur de champ page (l'id de message le plus petit pour chaque groupe de posts ayant la même valeur de Page) seulement dans le cas ou le champ page est supérieur à la valeur du message supprimé. Soit traduit en langage humain (parceque je me doute que c'est pas forcément super compréhensible :
  On déplace chaque 1er post de chaque page vers la page précédente, ou il sera automatiquement dernier à cause de son id de message.
 
En fait on ne met a jour que 1/10 des messages que l'on aurait mis à jour lors d'un redécallage des id si on utilisait la méthode BETWEEN+id consécutifs. c'est pour ca que je disais que le nombre de messages par page influe directement sur les performances de la suppression de messages.
 
C'est pas une méthode superclasse parceque asymptotiquement aussi mauvaise que le BETWEEN, mais en pratique on est dans le monde réel et les topics sont pas -si- énormes que ca, sans compter que l'on supprime rarement les vieux messages, diviser par 10 le cout de l'opération n'est pas négligeable il me semble. Par contre sur l'acces à une page quelconque, le temps est constant quelque-soit la page et le nombre de page ;)
 
Maintenant y'a une bonne nouvelle, je vous ai mentit, il reste encore une optimisation à faire sur cette idée, et l'on peut gagner bcp plus sur le temps de suppression en perdant très peu sur le temps d'accès à une page...


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1407365
scull
MySCULL cay bon mangez en!
Posté le 16-07-2006 à 00:35:54  profilanswer
 

rosco a écrit :

Tu nous présentes quand ta méthode Scull ? :o


 
Justement je suis dessus  :bounce:  
Et je suis en train de voir comment faire un mix avec ta technique. Tout cela ce concentre surtout sur l'amélioration de ta première requete ;)


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
n°1407367
rosco
Posté le 16-07-2006 à 00:40:21  profilanswer
 

0x90 > Je trouve ta méthode compliquée tout de même car t'as plusieurs cas différents à gérer suivant les options user, c'est pas top pratique. Et puis dans le cas d'un multi-DELETE simultané de X replys, t'es un peu embêté car faut pouvoir le gérer aussi.
 
Scull > Ah, j'attends car c'est la + critique et on pense pas forcément à tout  :jap:

Message cité 1 fois
Message édité par rosco le 16-07-2006 à 00:41:07
n°1407371
scull
MySCULL cay bon mangez en!
Posté le 16-07-2006 à 00:49:17  profilanswer
 

Heu le forum de liteboard il fait des trucs bizarres au niveau des temps de génération...
Je vous jure ! Promenez vous un peu dans le topic flood de liteboard...

Message cité 2 fois
Message édité par scull le 16-07-2006 à 00:49:48

---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
n°1407374
0x90
Posté le 16-07-2006 à 00:53:19  profilanswer
 

rosco a écrit :

0x90 > Je trouve ta méthode compliquée tout de même car t'as plusieurs cas différents à gérer suivant les options user, c'est pas top pratique. Et puis dans le cas d'un multi-DELETE simultané de X replys, t'es un peu embêté car faut pouvoir le gérer aussi.
 
Scull > Ah, j'attends car c'est la + critique et on pense pas forcément à tout  :jap:


 
 
Non y'a pas plusieurs cas, le 1er est un cas particulier du second, si tu veut la règle générale, il faut que le champ page soit égal a n/x+x ou x=nb de post par page de l'utilisateur divisé par nb de post par page minimal. Dans le cas n°1, x égal 1 ;)
 
Par contre, oui le multi-delete simultané peut-être compliqué, mais on parle alors d'une opération vraiment très rare dans un forum (genre ban d'un posteur + suppression de ses messages). Puis y'a pas de miracle, c'est pas les solutions les plus simples qui permettront de gagner du temps :/


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1407376
rosco
Posté le 16-07-2006 à 00:57:24  profilanswer
 

scull a écrit :

Heu le forum de liteboard il fait des trucs bizarres au niveau des temps de génération...
Je vous jure ! Promenez vous un peu dans le topic flood de liteboard...


Exact, les toutes dernières pages sont les plus rapide de toutes, si on remonte vers le début du topic le temps de génération augmente un peu. Dans ce topic, y avait qqu'un qui parlait d'une méthode utilisant une symétrie au niveau du LIMIT quand on dépassait la milieu d'un topic, il utilisait une sorte de "LIMIT négatif" ou je sais plus quoi pour partir de la fin des ID sans avoir à parcourir les 50000 avant. C'est peut être un truc dans le genre  :??: . Hum en fait le tps Mysql me parait bien faible, y aurait pas du cache là derrière ? :D

Message cité 1 fois
Message édité par rosco le 16-07-2006 à 01:00:09
n°1407379
scull
MySCULL cay bon mangez en!
Posté le 16-07-2006 à 01:08:22  profilanswer
 

rosco a écrit :

Dans ce topic, y avait qqu'un qui parlait d'une méthode utilisant une symétrie au niveau du LIMIT quand on dépassait la milieu d'un topic, il utilisait une sorte de "LIMIT négatif" ou je sais plus quoi pour partir de la fin des ID sans avoir à parcourir les 50000 avant. C'est peut être un truc dans le genre  :??: .


Overgrilled  :fou:  


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
n°1407380
rosco
Posté le 16-07-2006 à 01:10:18  profilanswer
 

:lol:
Présente toujours, c'était que du blabla si je me souviens bien, y avait rien de bien concret ;)


Message édité par rosco le 16-07-2006 à 01:10:50
n°1407383
scull
MySCULL cay bon mangez en!
Posté le 16-07-2006 à 01:12:24  profilanswer
 

J'ai pas encore bien fini mon truc, mais en gros je fais promener un "id" dans les urls pour limiter le nombre de topic à sélectionner...
Sinon j'ai penser à améliorer ton système de deux requètes en... 3 requètes :lol:  
Je voix pas ou est le soucis du moment que c'est plus rapide qu'avec une seule :o
 
 
Le truc en fait c'est d'avoir des réponses "marqueur" dans la liste des réponses.
Par exemple toutes les 500 réponses on met une réponse "normale" mais avec un champs différent. (parce exemple pour moi j'ai un champs valider : 1=ok, 0=poubelle; alors disons 2=marqueur).
 
http://www.image-dream.com/membre/up/anonym/1b2b05b1b651d3bc6c9a5c8bcfb8f115.gif
 
 
Et donc rapidement, on fait une première requete qui en fonction du numéro de la page trouve la l'id de la réponse marqueur la plus proche (floor bien sûr).  
 

Code :
  1. $nbreleveted = $page*15;
  2. $nbreleveted2 = $nbreleveted/500;
  3. $nbreleveted2 = floor($nbreleveted2);
  4. $nbreleveted3 = $nbreleveted2-1;
  5. $reqtopicelevated=mysql_query('
  6. SELECT SQL_SMALL_RESULT
  7. reponse.id FROM reponse
  8. WHERE reponse.sujet_id = "'.$id.'" AND reponse.valider="2"
  9. ORDER BY reponse.id ASC LIMIT '.$nbreleveted3.','.$nbreleveted2.'') or die(mysql_error());


 
Ensuite on sort l'id et on limite les dégats du ORDER BY  

Code :
  1. while($row3=mysql_fetch_array($reqtopicelevated)) {
  2. $idmarqueur = $row3['id'];
  3. }
  4. $requetesmall=mysql_query('
  5. SELECT SQL_SMALL_RESULT
  6. reponse.id
  7. FROM reponse
  8. WHERE reponse.sujet_id = "'.$id.'" AND reponse.valider>"0" AND reponse.id > "'.$idmarqueur.'"
  9. ORDER BY reponse.id ASC
  10. LIMIT '.$rep_mini.',15') or die(mysql_error());


 
Tiens d'ailleur en y pensant ? pourquoi pas faire un marqueur toutes les 5000 réponses ? avec un valider à 3 ? et une quatrieme requete ?   :pt1cable:

Message cité 2 fois
Message édité par scull le 16-07-2006 à 01:49:29

---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
n°1407393
mIRROR
Chevreuillobolchévik
Posté le 16-07-2006 à 01:39:00  profilanswer
 

scull a écrit :

le tps Mysql me parait bien faible, y aurait pas du cache là derrière ? :D


t as remarqué aussi ? :D
meme un tout petit id en local me prend 100 fois plus de temps :D

n°1407397
scull
MySCULL cay bon mangez en!
Posté le 16-07-2006 à 01:46:39  profilanswer
 

oups edit foireux :/


Message édité par scull le 16-07-2006 à 01:47:07

---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  405  406  407  ..  486  487  488  489  490  491

Aller à :
Ajouter une réponse
 

Sujets relatifs
question avec les forums phpbb2[php] trouver la premier place ou inserer un enregistrement (résolu)
Forums phpBBQui connait l'algo du Passticket et sa mise en place en VB ?
[Merise] Mise en place d'un MCDFocus mal placé....
[Blabla/Prog] Les développeurs foromeurs sont-ils des feignasses?Mise en place d'un formulaire CGI
forums création de site internetJava - Mise en place d'une api (Servlet)
Plus de sujets relatifs à : les développeurs de forums, les 3/4 des forums sont down /o\


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)