SELECT * FROM Produkte <<-- select * ist nicht optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- dein Problem ist hier
Zuerst setzen Sie einen Index auf prodid
siehe Antwort von @Anthony.
Dann ändern Sie die Abfrage wie folgt:
SELECT only,the,fields,you,need FROM Produkte
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Wenn Sie sicherstellen, dass Ihre IN
-Liste vor dem Angebot an die IN
-Klausel aufsteigend sortiert ist, wird das order by prodid
das gleiche Ergebnis liefern wie order by field(...
- Die Verwendung einer Funktion anstelle eines Feldes beseitigt die Möglichkeit der Verwendung eines Index und verursacht Langsamkeit.
select *
holt Daten, die Sie möglicherweise nicht benötigen, verursacht zusätzlichen Zugriff auf die Festplatte und zusätzlichen Speicherbedarf sowie zusätzlichen Netzwerkverkehr.
- Bei InnoDB, wenn Sie nur indexierte Felder
selecten
, liest MySQL niemals die Tabelle, sondern nur den Index und spart Zeit (in Ihrem Fall ist dies wahrscheinlich jedoch kein Problem)
Was ist der beste Weg, dies zu tun? MySQL HASH-Index, Speichern von Produkt IDs in Memcached oder etwas anderes?
Es gibt ein paar Tricks, die Sie verwenden können.
- Wenn die Produkte-Tabelle nicht zu groß ist, können Sie sie zu einer
memory
-Tabelle machen, die im RAM gespeichert ist. Machen Sie dies nicht für große Tabellen, es wird andere Dinge verlangsamen.
Sie können nur hash
-Indizes auf Memory-Tabellen verwenden.
- Wenn die prodid's kontinuierlich sind, können Sie statt
IN (1000, 1001 ..., 1019)
BETWEEN 1000 AND 1019
verwenden.
0 Stimmen
Was ist der Datentyp der
prodid
Spalte? Wie viele Produkt-IDs sind normalerweise imIN
-Ausdruck?0 Stimmen
Prodid ist INT (prodid < 100 000), IN besteht normalerweise aus 20 IDs.
0 Stimmen
Gibt es eine zusätzliche Beziehung zwischen den Daten, die durch direkte IDs ausgewählt wurden? Der Engpass könnte darin liegen, dass bei der Auswahl kleiner Datenmengen 20 Mal pro Abfrage über eine (vermutlich große) Datenbank gesprungen wird. Ein Clustering nach einem anderen Parameter könnte eine Option sein.
0 Stimmen
Nein, es gibt keine Beziehungen zu anderen Tabellen. Die Tabelle und das SELECT sind so einfach, wie sie gezeigt werden. Das externe System erledigt die ganze harte Arbeit - ich muss nur diese IDs auswählen und die Produktinformationen anzeigen.