Index på categoryId hjälper inte i det här fallet, IN (...)-frågor kommer att producera sekvenssökning istället för indexuppslag ändå.
Jag skulle överväga att först designa om systemet för att bli av med val av flera kategorier och, om det inte är lämpligt, cacha frågeresultat.
Till exempel kan du skapa en hjälptabell items_category_groups(hash, item_id) och efter klientfråga på flera kategorier hasha deras kombinerade id och slå upp den här tabellen. Om den inte hittas, gör en dyr fråga och fyll den här tabellen. Om hittas, gör en billig fråga genom att ansluta till dessa tabeller. Andra cachningsverktyg som memcached fungerar också.