[spip-dev] sélection de rubriques

Hello,
  on vient de tomber sur un cas un peu pénible avec la boite de
sélection de rubriques en 4 colonnes de l'interface privée.
  on fait des tests sur un site ayant beaucoup de rubriques (plus de
2000) et ça rame affreusement.

  après analyse, on a découvert que la requete suivante (au début
de inc/plonger.php) mettait jusqu'à 7 secondes à s'exécuter :
  $res = spip_query("SELECT rub1.id_rubrique, rub1.titre, rub1.id_parent,
rub1.lang, rub1.langue_choisie FROM spip_rubriques AS rub1,
spip_rubriques AS rub2 WHERE ((rub1.id_parent = $id_rubrique) OR
(rub2.id_parent = $id_rubrique AND rub1.id_parent=rub2.id_rubrique)) AND
rub1.id_rubrique!=$exclu GROUP BY rub1.id_rubrique");

  en séparant la requète en deux, par un "union", on descend à des temps
bien plus acceptables (<0,1 seconde) :
  $res = spip_query("
  SELECT rub1.id_rubrique, rub1.titre, rub1.id_parent, rub1.lang, rub1.langue_choisie
    FROM spip_rubriques AS rub1
   WHERE (rub1.id_parent = $id_rubrique)
     AND rub1.id_rubrique!=$exclu
UNION
  SELECT rub1.id_rubrique, rub1.titre, rub1.id_parent, rub1.lang, rub1.langue_choisie
    FROM spip_rubriques AS rub1, spip_rubriques AS rub2
   WHERE rub2.id_parent = $id_rubrique AND rub1.id_parent=rub2.id_rubrique
     AND rub1.id_rubrique!=$exclu");

d'après la doc, le "union" est présent depuis mysql 4.0, donc pas de problème de
compatibilité.
par contre, le "group by" dans l'original, l'absence de "order by" et l'utilité du
"$exclu" m'échappent un peu.
du coup, je suis pas sur que ça casse pas quelque chose ...

christian lefebvre wrote:

  on vient de tomber sur un cas un peu pénible avec la boite de
sélection de rubriques en 4 colonnes de l'interface privée.
  on fait des tests sur un site ayant beaucoup de rubriques (plus de
2000) et ça rame affreusement.

Christian,

Merci beaucoup. Le patch que tu proposes me répare le site !
J'ai passé une bonne partie de l'après-midi et du soir en essayant de comprendre pourquoi le sélecteur de rubriques sur la page d'un article ne fonctionne pas.

Avec le code que tu proposes, non seulement cela remarche, mais marche beaucoup plus vite qu'auparavant.

Etrange :

- Sur le site (PHP 5.2.2, Apache 2.2.4, MySQL 5.0.41) le sélecteur de rubriques (code SVN) marche sur la page de rubriques (un peu lentement) mais pas du tout sur la page d'articles.

- Et en local (PHP 5.2.2, Apache 2.2.4, 5.0.37) le code SVN tourne sans problème.

Paolo

christian lefebvre wrote:

par contre, le "group by" dans l'original, l'absence de "order by" et l'utilité du
"$exclu" m'échappent un peu.
du coup, je suis pas sur que ça casse pas quelque chose ...

Un GROUP BY implique aussi un tri en MySQL: "By default, MySQL sorts all GROUP BY col1, col2, ... queries as if you specified ORDER BY col1, col2, ... in the query as well." - http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

"$exclu", je pense, sans en être sûr, est utilisé par le plugin accès restreint, et peut-être autre chose ?

Paolo

par contre, le "group by" dans l'original, l'absence de "order by"

là je sais pas trop

et l'utilité du "$exclu" m'échappent un peu.

de mémoire, ça sert à éviter de proposer la rubrique (et ses enfants)
comme parent d'elle-même.

-- Fil