sql >> Base de Datos >  >> RDS >> Mysql

Optimizar SELECCIONAR... DONDE EN (...)

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 usar hash índices en tablas de memoria.
  • Si los prodid son continuos, puede usar BETWEEN 1000 AND 1019 en lugar de
    IN (1000, 1001 ..., 1019)