SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Mettez d'abord un index sur prodid voir la réponse de @Anthony.
Ensuite, modifiez la requête pour lire :
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Si vous vous assurez que votre IN la liste est triée par ordre croissant avant de la proposer au IN clause, le order by prodid donnera le même résultat si order by field(...
- L'utilisation d'une fonction au lieu d'un champ tue toute chance d'utiliser un index, ce qui entraîne des ralentissements.
select *récupérera les données dont vous n'avez peut-être pas besoin, ce qui entraînera un accès disque supplémentaire, une utilisation supplémentaire de la mémoire et un trafic réseau supplémentaire.- Sur InnoDB, si vous ne faites que
selectchamps indexés, MySQL ne lira jamais la table, mais seulement le temps d'enregistrement de l'index (dans votre cas, ce n'est probablement pas un problème cependant)
Il existe quelques astuces que vous pouvez utiliser.
- Si la table des produits n'est pas trop grande, vous pouvez en faire une
memorytable, qui est stockée dans la RAM. Ne faites pas cela pour les grandes tables, cela ralentira d'autres choses.
Vous ne pouvez utiliser que lehashindex sur les tables mémoire. - Si les prodid sont continus, vous pouvez utiliser
BETWEEN 1000 AND 1019au lieu deIN (1000, 1001 ..., 1019)