Index op categoryId zal in dit geval niet helpen, IN (...)-query's zullen hoe dan ook een sequentiescan produceren in plaats van index-lookup.
Ik zou overwegen om eerst het systeem opnieuw te ontwerpen om de selectie van meerdere categorieën te verwijderen en, als het niet gepast is, de queryresultaten in de cache op te slaan.
U kunt bijvoorbeeld een hulptabel items_category_groups(hash, item_id) maken en nadat de klant op meerdere categorieën heeft gezocht, hun gecombineerde id's hashen en deze tabel opzoeken. Indien niet gevonden, maak dan een dure zoekopdracht en vul deze tabel in. Maak, indien gevonden, een goedkope zoekopdracht om deze tabellen samen te voegen. Andere caching-tools zoals memcached zullen ook werken.