PHPNET Assistance

Support et Entraide PHPNET => Forum de programmation => Discussion démarrée par: vetofish le 11 mars 2009 à 10:11:28

Titre: Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 10:11:28
Bonjour,

Je viens de recevoir un mail automatique de phpnet me disant d'optimiser une requête SQL (je suis sur un mutualisé) :

SELECT posterTime FROM smf_messages WHERE ID_BOARD = 1 ORDER BY ID_MSG DESC
Quel index je peux rajouter ?
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 10:57:10
La base de données n'est plus accessible  :angry:
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: shaitan le 11 mars 2009 à 10:58:47
Salut,

Quelle version de smf utilises tu ? Avais tu installé des mods spécifiques en relation avec les messages, modifié quelque chose ?
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 11:01:18
SMF 1.1.6, patch de langue FR, aucun mods installé.
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 11:02:52
http://209.85.229.132/search?q=cache:fla-DvJPfOcJ:www.aquatribu.com/+aquatribu&hl=fr&ct=clnk&cd=1&gl=fr
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: shaitan le 11 mars 2009 à 11:07:14
Aucune idée si cela résoudrait le problème mais il serait bon de toute façon de le mettre à jour.
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 11:11:28
La mise à jour vers 1.1.8 est prévue, mais elle ne corrige que d'une vulnérabilité de la version 1.1.7 (donc qui ne me concerne pas).

De toute façon, je suis maintenant dans l'incapacité de faire la moindre mise à jour.
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: shaitan le 11 mars 2009 à 11:14:36
Si c'est possible par ftp mais tu dois avoir raison, ça ne devrait pas résoudre le problème. Si je me souviens bien 1.1.6 vers 1.1.7 cela concernait aussi seulement une faille de sécurité dans la gestions des packages.
Le mieux serait de demander de l'aide à quelqu'un connaissant bien smf, je pense à un membre ici en particulier, je t'envoie un MP, tu pourras le contacter pour lui indiquer ce fil si tu veux. Je suis sur que cela l'intéressera et cette personne a déjà dépanné un grands nombre de webmasters.

Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 11:37:49
merci pour le contact, je lui ai envoyé un MP.
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: marckisscool le 11 mars 2009 à 12:20:58
Bonjour,

Citer
SELECT posterTime FROM smf_messages WHERE ID_BOARD = 1 ORDER BY ID_MSG DESC

Je ne pense pas que le problème se situe sur cette requête précisément mais plutôt sur une modification apportée au forum, en effet je suppose qu'il s'agit de la recherche des derniers messages se trouvant dans la première section pour les afficher ensuite quelque part.
Pour l'optimiser:
Citer
SELECT posterTime FROM smf_messages WHERE ID_BOARD = 1 ORDER BY ID_MSG DESC LIMIT 15

Pour information, les modifications comme les thèmes du forum officiel ne sont ni vérifiés ni sûr, c'est en général à vos risques et périls  ^_^
Les mises à jour depuis smf 1.1.6 concernent exclusivement la faille sur la gestion des packages et des pièces jointes  ^_^
A+
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 13:05:44
Merci marc pour ta réactivité, mais il semble que le problème vienne des premiers résultats affichés sur le forum "bavardage" (ID 1), et plus particulièrement avec 2 discussions : http://209.85.229.132/search?q=cache:iJTZkBi2FpUJ:www.aquatribu.com/index.php%3Fboard%3D1.0+site:www.aquatribu.com+aquatribu+board+1.0&hl=fr&ct=clnk&cd=6&gl=fr

- Qui fait quoi (51 pages) : http://www.aquatribu.com/index.php?topic=7530.0
- Qui est en ligne (93 pages) : http://www.aquatribu.com/index.php?topic=7187.0

qui sont trop lourdes à gérer pour la base de données (afficher le nom du dernier posteur).

En attendant je les déplacerai dans la corbeille, et je vais ajouter un index pour accélérer ce type de requete.

SELECT posterTime FROM smf_messages WHERE ID_BOARD = 1 ORDER BY ID_MSG DESC
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 13:10:35
Quelle est l'IP du cl1-sql4 ?

195.144.11.6
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 11 mars 2009 à 13:55:16
Cette requete est maintenant traitée en 170 ms.

Je pense que le problème est réglé. -_-
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: shaitan le 11 mars 2009 à 13:58:22
Un petit mot à Mkc, ma démarche était un peu culotté, j'espère que tu ne m'en voudras pas, c'était pour une bonne cause.
Titre: Re : Re : Optimisation de requête SQL (forum smf)
Posté par: marckisscool le 12 mars 2009 à 10:29:41
Merci marc pour ta réactivité, mais il semble que le problème vienne des premiers résultats affichés sur le forum "bavardage" (ID 1), et plus particulièrement avec 2 discussions : http://209.85.229.132/search?q=cache:iJTZkBi2FpUJ:www.aquatribu.com/index.php%3Fboard%3D1.0+site:www.aquatribu.com+aquatribu+board+1.0&hl=fr&ct=clnk&cd=6&gl=fr

- Qui fait quoi (51 pages) : http://www.aquatribu.com/index.php?topic=7530.0
- Qui est en ligne (93 pages) : http://www.aquatribu.com/index.php?topic=7187.0

qui sont trop lourdes à gérer pour la base de données (afficher le nom du dernier posteur).

En attendant je les déplacerai dans la corbeille, et je vais ajouter un index pour accélérer ce type de requete.

SELECT posterTime FROM smf_messages WHERE ID_BOARD = 1 ORDER BY ID_MSG DESC

Bonjour,

Alors pour ma part je suis parti du script d'origine de smf de la version 1.1.6 qui est presque identique à la version 1.1.8.
Une telle requête en l'état n'existe pas dans un smf d'origine, les requêtes utilisent presque toutes des jointures avec des conditions.

Maintenant sur la question de la requête, elle récupère le timestamp des posts classé par id du plus grand au plus petit de la section numéro 1, cela n'affiche absolument pas le nom du dernier posteur, cela récupère une date sur la totalité des posts fait dans la section 1. Il serait intéressant de savoir de quel fichier provient cette requête et le code associé à cette requête.

Pour information le nombre de page est pas calculé à la phpbb en listant la totalité des messages, mais grâce à un champ dans la table topic (qui ne contient aucun message) et qui contient le nombre de réponses à un post. Ce champs est récupéré dans le listage des sujets ou dans la consultation des posts d'un sujet et permet de calculer le nombre de page en pure code php sans alourdir la base de données de requêtes inutiles.

Donc pour résoudre ton problème il faut identifier le code qui produit cette requête et optimiser le code en conséquence.

@Shaitan: tu pouvais citer le fofo  ^_^, sinon pas de soucis  ^_^

Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 12 mars 2009 à 12:28:02
Le code semble provenir du fichier load.php, ligne 417 (version 1.1.8) :

// Found 'im, let's set up the variables.
if ($ID_MEMBER != 0)
{
// Let's not update the last visit time in these cases...
// 1. SSI doesn't count as visiting the forum.
// 2. RSS feeds and XMLHTTP requests don't count either.
// 3. If it was set within this session, no need to set it again.
// 4. New session, yet updated < five hours ago? Maybe cache can help.
if (SMF != 'SSI' && !isset($_REQUEST['xml']) && (!isset($_REQUEST['action']) || $_REQUEST['action'] != '.xml') && empty($_SESSION['ID_MSG_LAST_VISIT']) && (empty($modSettings['cache_enable']) || ($_SESSION['ID_MSG_LAST_VISIT'] = cache_get_data('user_last_visit-' . $ID_MEMBER, 5 * 3600)) === null))
{
// Do a quick query to make sure this isn't a mistake.
$result = db_query("
SELECT posterTime
FROM {$db_prefix}messages
WHERE ID_MSG = $user_settings[ID_MSG_LAST_VISIT]
LIMIT 1", __FILE__, __LINE__);
list ($visitTime) = mysql_fetch_row($result);
mysql_free_result($result);
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: shaitan le 12 mars 2009 à 14:17:32
Citer
@Shaitan: tu pouvais citer le fofo  , sinon pas de soucis


Tu parles bien de ce forum http://support.smfgratuit.org/ ou l'on trouve de l'aide, des traductions de Mod, des mods, une communauté sympa, la possiblité d'obtenir un forum sur mesure avec pleins de fonctions, un choix énorme de skin ? http://support.smfgratuit.org/
Je ne me le suis pas permis car j'aurais eu l'impression de faire de la pub :))
http://support.smfgratuit.org/
Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: marckisscool le 12 mars 2009 à 15:06:40
@vetofish:
hmmm je suis perplexe là nan parce que là si on compare les 2 requêtes:
Dans ton premier post
Citer
SELECT posterTime FROM smf_messages WHERE ID_BOARD = 1 ORDER BY ID_MSG DESC
Cette requête recherche toutes les dates des messages de la section numéro 1 en classant les posts par id.

et la requête que tu m'indiques:
Citer
SELECT posterTime FROM {$db_prefix}messages WHERE ID_MSG = $user_settings[ID_MSG_LAST_VISIT] LIMIT 1
Cette requête va rechercher UNE SEULE DATE d'un message issue de la dernière visite du membre (pour savoir s'il doit mettre à jour ou pas dans la suite du code).

Pour moi cela n'a pas de rapport et la requête est déjà optimisée.

@shaitan: mdr, j'en demandais pas autant  ^_^, juste le lien  -_-



Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: vetofish le 12 mars 2009 à 23:59:48
Dans le mail de phpnet m'informant qu'une requête était trop longue, après vérification, il y a bien une limite, mais le texte est tronqué à LIM.

J'ai fait un grep sur tous les fichiers SMF, il n'y a qu'un seul résultat qui corresponde (load.php).

C'est dommage, j'étais passé de phpbb à smf car ce forum semblait plus optimisé ... :-(
Titre: Re : Re : Optimisation de requête SQL (forum smf)
Posté par: marckisscool le 14 mars 2009 à 11:18:53
Dans le mail de phpnet m'informant qu'une requête était trop longue, après vérification, il y a bien une limite, mais le texte est tronqué à LIM.

J'ai fait un grep sur tous les fichiers SMF, il n'y a qu'un seul résultat qui corresponde (load.php).

C'est dommage, j'étais passé de phpbb à smf car ce forum semblait plus optimisé ... :-(
C'est bon j'ai trouvé et très franchement phpnet aurait pu être plus explicite dans les informations qu'ils t'ont données.
Ton soucis vient certainement du flux RSS et plus particulièrement de la fonction getXmlRecent() et getXmlNews()se trouvant dans le fichier Sources/News.php
Citer
   $request = db_query("
      SELECT
         m.smileysEnabled, m.posterTime, m.ID_MSG, m.subject, m.body, m.ID_TOPIC, t.ID_BOARD,
         b.name AS bname, t.numReplies, m.ID_MEMBER, mf.ID_MEMBER AS ID_FIRST_MEMBER,
         IFNULL(mem.realName, m.posterName) AS posterName, mf.subject AS firstSubject,
         IFNULL(memf.realName, mf.posterName) AS firstPosterName, mem.hideEmail,
         IFNULL(mem.emailAddress, m.posterEmail) AS posterEmail, m.modifiedTime
      FROM ({$db_prefix}messages AS m, {$db_prefix}messages AS mf, {$db_prefix}topics AS t, {$db_prefix}boards AS b)
         LEFT JOIN {$db_prefix}members AS mem ON (mem.ID_MEMBER = m.ID_MEMBER)
         LEFT JOIN {$db_prefix}members AS memf ON (memf.ID_MEMBER = mf.ID_MEMBER)
      WHERE t.ID_TOPIC = m.ID_TOPIC
         AND b.ID_BOARD = " . (empty($board) ? 't.ID_BOARD' : "$board
         AND t.ID_BOARD = $board") . "
         AND mf.ID_MSG = t.ID_FIRST_MSG
         AND m.ID_MSG IN (" . implode(', ', $messages) . ")
      ORDER BY m.ID_MSG DESC
      LIMIT $_GET[limit]", __FILE__, __LINE__);
Et en faite ce $_GET[limit] est une cochonnerie puisque si on regarde bien il est délimité plus haut comme tel:
Citer
   // Default to latest 5.  No more than 255, please.
   $_GET['limit'] = empty($_GET['limit']) || (int) $_GET['limit'] < 1 ? 5 : min((int) $_GET['limit'], 255);
retourner jusqu'à 255 messages dans un gros fil de discussion c'est dangereux pour les ressources d'un serveur, tu peux déjà changer le 255 en 50 ou alors désactiver le flux RSS ce qui obligera les membres à faire l'effort de venir lire le contenu du forum.

En espérant que l'on a mis le doigt dessus  ^_^

Titre: Re : Optimisation de requête SQL (forum smf)
Posté par: thibaud le 16 mars 2009 à 08:24:50
ce soucis est réglé ou pas ?

on a réactivé la bdd concernée ?
Titre: Re : Re : Optimisation de requête SQL (forum smf)
Posté par: marckisscool le 17 mars 2009 à 08:44:35
on a réactivé la bdd concernée ?
oui puisque son forum à l'air d'être en ligne http://www.aquatribu.com/
Par contre il n'est pas à jour sur les soucis de sécurité (il faut impérativement passer la mise à jour 1.1.7 et 1.1.8)
Pour le reste aucune idée.

Est il possible Thibaud d'avoir la fin du message qui a été transmis à l'utilisateur(ou le fichier qui émet cette requête), afin de conforter la théorie du flux RSS:
Citer
SELECT posterTime FROM smf_messages WHERE ID_BOARD = 1 ORDER BY ID_MSG DESC LIMIT

Merci d'avance.