Mysql
 sql >> Database >  >> RDS >> Mysql

Ottimizza SELEZIONA ... DOVE 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

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 solo hash indici su tabelle di memoria.
  • Se i prodid sono continui, puoi usare BETWEEN 1000 AND 1019 invece di
    IN (1000, 1001 ..., 1019)