Mysql
 sql >> Base de données >  >> RDS >> Mysql

Optimiser SELECT ... WHERE IN (...)

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 le hash index sur les tables mémoire.
  • Si les prodid sont continus, vous pouvez utiliser BETWEEN 1000 AND 1019 au lieu de
    IN (1000, 1001 ..., 1019)