SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Per prima cosa metti un indice su prodid
vedi la risposta di @Anthony.
Quindi cambia la query per leggere:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Se sei sicuro che il tuo IN
l'elenco viene ordinato in ordine crescente prima di offrirlo a IN
clausola, l'order by prodid
produrrà lo stesso risultato anche order by field(...
- L'utilizzo di una funzione al posto di un campo elimina ogni possibilità di utilizzare un indice, causando lentezza.
select *
recupererà i dati che potrebbero non essere necessari, causando un accesso aggiuntivo al disco e un utilizzo aggiuntivo della memoria e traffico di rete aggiuntivo.- Su InnoDB, se solo
select
campi indicizzati, MySQL non leggerà mai la tabella, ma solo l'indice risparmiando tempo (nel tuo caso probabilmente questo non è un problema)
Ci sono alcuni trucchi che puoi usare.
- Se la tabella dei prodotti non è troppo grande, puoi renderla una
memory
tabella, che è memorizzata nella RAM. Non farlo per i tavoli grandi, rallenterà altre cose.
Puoi usare solohash
indici su tabelle di memoria. - Se i prodid sono continui, puoi usare
BETWEEN 1000 AND 1019
invece diIN (1000, 1001 ..., 1019)