SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Първо поставете индекс на prodid вижте отговора на @Anthony.
След това променете заявката да чете:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Ако се уверите, че вашият IN списъкът се сортира възходящо, преди да се предложи на IN клауза, order by prodid ще даде същия резултат както order by field(...
- Използването на функция вместо поле убива всяка възможност за използване на индекс, което води до забавяне.
select *ще извлече данни, които може да не са ви необходими, причинявайки допълнителен достъп до диск и допълнително използване на паметта и допълнителен мрежов трафик.- В InnoDB, ако само
selectиндексирани полета, MySQL никога няма да прочете таблицата, а само времето за спестяване на индекс (във вашия случай обаче това вероятно не е проблем)
Има няколко трика, които можете да използвате.
- Ако таблицата с продукти не е твърде голяма, можете да я направите
memoryтаблица, която се съхранява в RAM. Не правете това за големи маси, това ще забави други неща.
Можете да използвате самоhashиндекси на таблици с памет. - Ако prodid-ите са непрекъснати, можете да използвате
BETWEEN 1000 AND 1019вместоIN (1000, 1001 ..., 1019)