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)