Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Optimieren AUSWÄHLEN ... WO 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

Setzen Sie zuerst einen Index auf prodid siehe Antwort von @Anthony.

Dann ändern Sie die Abfrage wie folgt:

SELECT only,the,fields,you,need FROM  products
WHERE  prodid in (10331,11639,12127..) 
ORDER BY prodid

Wenn Sie sicherstellen, dass Ihr IN Die Liste wird aufsteigend sortiert, bevor sie dem IN angeboten wird -Klausel, die order by prodid ergibt dasselbe Ergebnis wie order by field(...

  • Die Verwendung einer Funktion anstelle eines Felds vernichtet jede Möglichkeit, einen Index zu verwenden, was zu Langsamkeit führt.
  • select * ruft Daten ab, die Sie möglicherweise nicht benötigen, was zu zusätzlichem Festplattenzugriff, zusätzlicher Speichernutzung und zusätzlichem Netzwerkverkehr führt.
  • Auf InnoDB, wenn Sie nur select indizierte Felder, MySQL wird niemals die Tabelle lesen, sondern nur den Index sparen Zeit (in Ihrem Fall ist das aber wahrscheinlich kein Problem)

Es gibt ein paar Tricks, die Sie anwenden können.

  • Wenn die Produkttabelle nicht zu groß ist, können Sie sie zu einem memory machen Tabelle, die im RAM gespeichert wird. Tun Sie dies nicht für große Tabellen, es verlangsamt andere Dinge.
    Sie können nur hash verwenden Indizes auf Speichertabellen.
  • Wenn die Prodids kontinuierlich sind, können Sie BETWEEN 1000 AND 1019 verwenden statt
    IN (1000, 1001 ..., 1019)