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 usarhash
índices em tabelas de memória. - Se os prodids forem contínuos, você pode usar
BETWEEN 1000 AND 1019
em vez deIN (1000, 1001 ..., 1019)