SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Primero ponga un índice en prodid
ver la respuesta de @Anthony.
Entonces cambie la consulta para que diga:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Si te aseguras de que tu IN
la lista se ordena de forma ascendente antes de ofrecerla a IN
cláusula, el order by prodid
dará el mismo resultado als order by field(...
- Usar una función en lugar de un campo elimina cualquier posibilidad de usar un índice, lo que causa lentitud.
select *
obtendrá datos que quizás no necesite, lo que provocará un acceso adicional al disco, un uso adicional de la memoria y un tráfico adicional en la red.- En InnoDB, si solo
select
campos indexados, MySQL nunca leerá la tabla, sino solo el tiempo de ahorro del índice (en su caso, probablemente esto no sea un problema)
Hay algunos trucos que puedes usar.
- Si la tabla de productos no es demasiado grande, puede convertirla en una
memory
tabla, que se almacena en la memoria RAM. No hagas esto para tablas grandes, ralentizará otras cosas.
Solo puedes usarhash
índices en tablas de memoria. - Si los prodid son continuos, puede usar
BETWEEN 1000 AND 1019
en lugar deIN (1000, 1001 ..., 1019)