SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Sæt først et indeks på prodid
se @Anthonys svar.
Ændr derefter forespørgslen til at læse:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Hvis du sørger for at din IN
listen er sorteret stigende, før den tilbydes til IN
klausulen, order by prodid
vil give det samme resultat som order by field(...
- Brug af en funktion i stedet for et felt dræber enhver chance for at bruge et indeks, hvilket forårsager langsommelighed.
select *
henter data, du måske ikke har brug for, hvilket forårsager ekstra diskadgang og ekstra hukommelsesforbrug og ekstra netværkstrafik.- På InnoDB, hvis du kun
select
indekserede felter, vil MySQL aldrig læse tabellen, men kun indeksbesparelsen (i dit tilfælde er dette sandsynligvis ikke et problem)
Der er et par tricks, du kan bruge.
- Hvis produkttabellen ikke er for stor, kan du gøre den til en
memory
tabel, som er gemt i RAM. Gør ikke dette for store borde, det vil bremse andre ting.
Du kan kun brugehash
indekser på hukommelsestabeller. - Hvis prodid'erne er kontinuerlige, kan du bruge
BETWEEN 1000 AND 1019
i stedet forIN (1000, 1001 ..., 1019)