Index na categoryId v tomto případě nepomůže, dotazy IN (...) stejně provedou sekvenční skenování namísto vyhledávání indexu.
Nejprve bych zvážil přepracování systému, abych se zbavil výběru více kategorií, a pokud to není vhodné, ukládání výsledků dotazů do mezipaměti.
Můžete například vytvořit pomocnou tabulku items_category_groups(hash, item_id) a po dotazu klienta na více kategorií hashovat jejich kombinovaná id a vyhledat tuto tabulku. Pokud nenaleznete, proveďte drahý dotaz a vyplňte tuto tabulku. Pokud najdete, proveďte levný dotaz spojením těchto tabulek. Ostatní nástroje pro ukládání do mezipaměti, jako je memcached, budou také fungovat.