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
selectindexovaná 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
memorytabulky, která je uložena v paměti RAM. Nedělejte to u velkých stolů, zpomalí to ostatní věci.
Můžete použít pouzehashindexy na paměťových tabulkách. - Pokud jsou prodidy souvislé, můžete použít
BETWEEN 1000 AND 1019místoIN (1000, 1001 ..., 1019)