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 ...
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.
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 ...