Bonjour,
je me tourne aujourd'hui vers vous après avoir posé ma question sans succès sur forum.spip.org puis sur la liste spip@rezo.net.
J'ai un énorme problème de performances en raison de la manière dont spip gère les critères IN :
plutôt que de générer une requête SQL "IN" (ce qui serait logique), les fonctions "critere_IN_dist" et "calculer_critere_externe_init" de public.php génèrent des SELECT FIELD() qui n'utilisent pas les index dans la base (!!).
Mon site est bloqué sous spip 1.9.2 pour encore au moins 6 mois, donc est-ce que quelqu'un aurait une version de ces deux fonctions compatible avec la v1.9.2g qui génèrerait des requêtes SQL IN ? ou encore une méthode pour forcer l'optimiseur mysql à utiliser les index avec les SELECT FIELD ?
Pour répondre par avance aux questions / remarques :
- je sais pourquoi ce choix a été fait, j'ai lu les archives de la liste : conserver l'ordre des paramètres d'entrée dans le résultat
=> je n'ai pas besoin de cette particularité
- la structure de mon site est atypique par obligation (contraintes éditoriales) et utilise IN et les ARRAY intensivement pour palier
le manque de {branche IN a,b,c} et {!id_mot=x} de spip 1.9 avec des performances optimales (normalement du moins, si les index étaient utilisés)
- je ne connais malheureusement pas assez les entrailles de spip et n'ai pas le temps de m'y plonger suffisamment dans l'immédiat pour me lancer dans la modification
de ces fonctions moi-même car je maintiens un site à titre professionnel et ai de grosses contraintes d'emploi du temps par ailleurs.
- on m'a signalé sur spip@rezo.net que la version 2.x générait des requêtes SQL "IN" dès qu'un GROUP BY est aussi présent
=> je répète que je suis dans l'impossibilité de passer à la version 2 pour le moment
=> même si c'est mieux, ce choix me paraît aussi hasardeux et contre-intuitif : du point de vue utilisateur on s'attend à ce qu'un "IN" spip
génère un "IN" SQL quel que soit le cas, l'exception où on veut conserver l'ordre des valeurs d'entrée faisant l'objet d'un traitement spécifique, par exemple avec un modificateur.
(Sinon, si ce n'est pas pour maintenir la cohérence avec SQL et autres, pourquoi garder le critère en anglais plutôt que de l'appeler "PARMI" ?)
Dans mon cas particulier, utiliser le critère en v2.0 tel qu'il est aujourd'hui me forcerait à trier les résultats pour éviter de réduire les performances, alors que je n'ai pas besoin du tri
(création d'un champ de référence d'id_rubrique sur lequel je fais plusieurs post-traitements, le tri intervenant à la fin sur les articles contenus uniquement)
Merci d'avance à ceux qui pourront m'aider sur ce coup-là, j'aimerais autant ne pas avoir à réécrire plusieurs centaines de lignes sur les quelques milliers que comptent mes squelettes...
Et vivement que je puisse travailler avec la v2 qui m'a juste l'air énorme !
Simon Camerlo