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
select
champs 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
memory
table, 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 lehash
index sur les tables mémoire. - Si les prodid sont continus, vous pouvez utiliser
BETWEEN 1000 AND 1019
au lieu deIN (1000, 1001 ..., 1019)