Performances et critère IN

Bonjour,

J'ai de gros soucis de performances sur le site que j'administre à cause des requêtes SQL générées par le critère {xxx IN (array)}.
La structure particulière de notre site nous a obligés à y faire appel intensivement pour pallier à l'absence des critères optimisés {branche IN a,b,c} et {! id_mot IN d,e,f} de spip 1.9.2.

Le problème de ce critère c'est qu'il ne génère pas des requêtes SQL "IN" mais des "SELECT FIELD(a,b,c)" qui n'utilisent pas les index ni les clés (!!! j'ai encore du mal à le croire... quel intérêt ?). Résultat, la moindre requête parcourt l'intégralité des tables occasionnant une charge monstrueuse et des locks de tables interminables dès que le nombre de visiteurs simultanés augmente un peu.

Quelqu'un connaît-il un moyen pour contourner ce problème par l'un des moyens suivants :
- forcer mysql à utiliser les index sur les requêtes FIELD
- passer les critères de boucles IN sur des requêtes SQL... IN, qui, elles, utilisent les index (dans le genre intuitif, les devs ont fait fort sur ce coup-là)
- le tout en sachant que je suis pour l'instant bloqué sur spip 1.9.2, impossible de passer à 2.x avant la fin de l'année

J'ai longuement cherché dans les archives de toutes les listes et les forums, je n'ai trouvé qu'un fil sur la liste spip-dev reconnaissant en partie que le passage de IN à FIELD était un mauvais choix et qu'il faudrait certainement revenir en arrière, mais visiblement ça n'a pas été fait :frowning:

Merci d'avance à ceux qui pourront m'aider, j'aimerais vraiment ne pas avoir à réécrire tout mon code (plusieurs milliers de lignes)...

Simon Camerlo a écrit :

Le problème de ce critère c'est qu'il ne génère pas des requêtes SQL "IN" mais des "SELECT FIELD(a,b,c)" qui n'utilisent pas les index ni les clés (!!! j'ai encore du mal à le croire... quel intérêt ?).

L'intérêt fut de pouvoir classer les articles dans un certain ordre IN 4,1,5 les affiche dans cet l'ordre donné.

J'ai longuement cherché dans les archives de toutes les listes et les forums, je n'ai trouvé qu'un fil sur la liste spip-dev reconnaissant en partie que le passage de IN à FIELD était un mauvais choix et qu'il faudrait certainement revenir en arrière, mais visiblement ça n'a pas été fait :frowning:

Bah si, ça a été fait, ce n'est plus tout à fait comme ça en SPIP 2.0... Dès qu'un autre tri est présent, le tri sur IN n'est pas appliqué.

--
MM.

Bonjour,

je reformule mes questions une dernière fois, svp si quelqu'un peut me dépanner ça m'aiderait beaucoup :
- y'a-t-il moyen de forcer mysql à utiliser les index sur une requête select field ? (rien trouvé à ce sujet sur le net)
- quelqu'un aurait-il une version des fonctions "calculer_critere_externe_init" et "critere_IN_dist" compatible avec spip1.9.2g et utilisant SQL IN à la place de FIELD ?

Merci d'avance