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
select
indexerade 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
memory
tabell, som lagras i RAM. Gör inte detta för stora bord, det kommer att sakta ner andra saker.
Du kan bara användahash
index på minnestabeller. - Om prodiderna är kontinuerliga kan du använda
BETWEEN 1000 AND 1019
istället förIN (1000, 1001 ..., 1019)