Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Otimizar 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

Primeiro coloque um índice em prodid veja a resposta de @Anthony.

Do que alterar a consulta para ler:
SELECT only,the,fields,you,need FROM  products
WHERE  prodid in (10331,11639,12127..) 
ORDER BY prodid

Se você se certificar de que seu IN lista é ordenada em ordem crescente antes de oferecê-la ao IN cláusula, a order by prodid irá produzir o mesmo resultado que order by field(...
  • Usar uma função em vez de um campo elimina qualquer chance de usar um índice, causando lentidão.
  • select * irá buscar dados que você pode não precisar, causando acesso extra ao disco e uso extra de memória e tráfego de rede extra.
  • No InnoDB, se você apenas select campos indexados, o MySQL nunca lerá a tabela, mas apenas o índice economizando tempo (no seu caso, isso provavelmente não é um problema)

Existem alguns truques que você pode usar.
  • Se a tabela de produtos não for muito grande, você pode torná-la uma memory tabela, que é armazenada na RAM. Não faça isso para tabelas grandes, pois isso tornará outras coisas mais lentas.
    Você só pode usar hash índices em tabelas de memória.
  • Se os prodids forem contínuos, você pode usar BETWEEN 1000 AND 1019 em vez de
    IN (1000, 1001 ..., 1019)