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 nurhash
verwenden Indizes auf Speichertabellen. - Wenn die Prodids kontinuierlich sind, können Sie
BETWEEN 1000 AND 1019
verwenden stattIN (1000, 1001 ..., 1019)