SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Lägg först ett index på prodid se @Anthonys svar.
Ändra sedan frågan till att läsa:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Om du ser till att din IN listan sorteras stigande innan den erbjuds till IN satsen, order by prodid kommer att ge samma resultat som order by field(...
- Att använda en funktion istället för ett fält dödar alla chanser att använda ett index, vilket orsakar långsamhet.
select *hämtar data som du kanske inte behöver, vilket orsakar extra diskåtkomst och extra minnesanvändning och extra nätverkstrafik.- På InnoDB, om du bara
selectindexerade fält, kommer MySQL aldrig att läsa tabellen, utan bara indexbesparingstiden (i ditt fall är detta förmodligen inte ett problem dock)
Det finns några knep du kan använda.
- Om produkttabellen inte är för stor kan du göra den till ett
memorytabell, som lagras i RAM. Gör inte detta för stora bord, det kommer att sakta ner andra saker.
Du kan bara användahashindex på minnestabeller. - Om prodiderna är kontinuerliga kan du använda
BETWEEN 1000 AND 1019istället förIN (1000, 1001 ..., 1019)