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
selectgeï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
memoryvan maken tabel, die is opgeslagen in RAM. Doe dit niet voor grote tafels, het vertraagt andere dingen.
Je kunt alleenhashgebruiken indexen op geheugentabellen. - Als de prodid's continu zijn, kunt u
BETWEEN 1000 AND 1019gebruiken in plaats vanIN (1000, 1001 ..., 1019)