SELECT * FROM products <<-- select * is non-optimal
WHERE prodid in (10331,11639,12127..)
ORDER BY Field(prodid, 10331,11639,12127...); <<-- your problem is here
Nejprve vložte index na prodid
viz odpověď @Anthony.
Poté změňte dotaz na čtení:
SELECT only,the,fields,you,need FROM products
WHERE prodid in (10331,11639,12127..)
ORDER BY prodid
Pokud se ujistíte, že jste IN
seznam je seřazen vzestupně, než jej nabídne IN
klauzule, order by prodid
přinese stejný výsledek jako order by field(...
- Použití funkce místo pole zabíjí jakoukoli šanci na použití indexu, což způsobuje pomalost.
select *
načte data, která možná nepotřebujete, což způsobí další přístup k disku a další využití paměti a další síťový provoz.- Na InnoDB, pokud pouze
select
indexovaná pole, MySQL nikdy nepřečte tabulku, ale pouze čas úspory indexu (ve vašem případě to však pravděpodobně není problém)
Existuje několik triků, které můžete použít.
- Pokud není tabulka produktů příliš velká, můžete z ní vytvořit
memory
tabulky, která je uložena v paměti RAM. Nedělejte to u velkých stolů, zpomalí to ostatní věci.
Můžete použít pouzehash
indexy na paměťových tabulkách. - Pokud jsou prodidy souvislé, můžete použít
BETWEEN 1000 AND 1019
místoIN (1000, 1001 ..., 1019)