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
selectindizierte 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
memorymachen Tabelle, die im RAM gespeichert wird. Tun Sie dies nicht für große Tabellen, es verlangsamt andere Dinge.
Sie können nurhashverwenden Indizes auf Speichertabellen. - Wenn die Prodids kontinuierlich sind, können Sie
BETWEEN 1000 AND 1019verwenden stattIN (1000, 1001 ..., 1019)