SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Zet eerst een index op prodid
zie het antwoord van @Anthony.
Verander dan de zoekopdracht om te lezen:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Als u ervoor zorgt dat uw IN
lijst wordt oplopend gesorteerd voordat deze wordt aangeboden aan de IN
clausule, de order by prodid
zal hetzelfde resultaat opleveren als order by field(...
- Het gebruik van een functie in plaats van een veld verkleint elke kans op het gebruik van een index, wat traagheid veroorzaakt.
select *
haalt gegevens op die u misschien niet nodig hebt, wat extra schijftoegang en extra geheugengebruik en extra netwerkverkeer veroorzaakt.- Op InnoDB, als je alleen
select
geïndexeerde velden, MySQL zal nooit de tabel lezen, maar alleen de indexbesparingstijd (in uw geval is dit echter waarschijnlijk geen probleem)
Er zijn een paar trucjes die je kunt gebruiken.
- Als de producttabel niet te groot is, kun je er een
memory
van maken tabel, die is opgeslagen in RAM. Doe dit niet voor grote tafels, het vertraagt andere dingen.
Je kunt alleenhash
gebruiken indexen op geheugentabellen. - Als de prodid's continu zijn, kunt u
BETWEEN 1000 AND 1019
gebruiken in plaats vanIN (1000, 1001 ..., 1019)