Je soupçonne que la lenteur réside dans la récupération des lignes, le nombre de lignes renvoyées, plutôt que les 5000+ espaces réservés de liaison dans l'instruction. pId IN ( ? , ? , ... , ? )
Ma suggestion serait de tester le retour d'une seule ligne, de fournir une valeur dont on sait qu'elle existe/renvoie une ligne, puis plus de 4999 valeurs dont on sait qu'elles n'existent pas/ne renvoient pas de ligne.
Par exemple, si nous connaissons la valeur de pId la plus élevée dans la table, utilisez des valeurs supérieures à celle-ci, fournissez des valeurs de liaison pour une instruction comme celle-ci
... pId IN ( ? , ? , ? , ... , ? )
donc le résultat serait équivalent à courir
... pId IN ( 99999999 , 99999998 , 99999997 , ... , 42 )
ce qui serait le même résultat que nous obtiendrions en cours d'exécution
... pId IN ( 42 )
Notre attente serait de renvoyer une seule ligne ( pId =42 ).
Comparez ensuite le timing de cela (plus de 5000 valeurs de liaison renvoyant 1 ligne) à deux valeurs de liaison renvoyant une seule ligne
... pId IN ( 99999999 , 42 )
Et voyez s'il y a une différence significative dans les performances.
(Il y a plus de travail à faire avec plus de 5000 valeurs de liaison, mais je ne m'attendrais pas à un énorme différence, mais cela devrait être testé.
En y réfléchissant un peu, il pourrait être plus facile de configurer un test en utilisant toutes les valeurs de liaison existantes et en ajoutant simplement LIMIT 2
jusqu'à la fin de la requête. (Je ne sais pas si MySQL a des améliorations de performances pour LIMIT 2
.
Il peut être préférable d'ajouter une condition comme AND pId * 10 = 420
L'objectif est de fournir toute une série de valeurs de liaison mais de ne renvoyer qu'une ou deux lignes.
Un autre test consisterait à renvoyer toute une série de lignes, mais en utilisant seulement quelques valeurs de liaison. Peut-être une condition de plage qui renvoie plus de 5 000 lignes.
La requête pourrait être :
... pId >= ? AND pId <= ?
avec une plage suffisamment large entre les valeurs fournies pour que nous obtenions environ 5 000 lignes.
Et comparez les performances.
Ma prédiction (devinez ?) est que les performances seront davantage corrélées au nombre de lignes renvoyées qu'au nombre de valeurs de liaison.
Je ne sais pas s'il s'agit d'une réponse à votre question, mais c'est l'approche que j'adopterais pour répondre à la question ... "qu'est-ce qui rend cela lent, le nombre de valeurs de liaison ou le nombre de lignes renvoyées ? "