Indeks na categoryId nie pomoże w tym przypadku, IN (...) zapytania i tak wygenerują skanowanie sekwencji zamiast wyszukiwania indeksu.
Rozważałbym najpierw przeprojektowanie systemu, aby pozbyć się wyboru wielu kategorii, a jeśli nie jest to właściwe, buforowanie wyników zapytań.
Na przykład można utworzyć tabelę pomocniczą items_category_groups(hash, item_id) i po zapytaniu klienta o wiele kategorii mieszamy ich połączone identyfikatory i przeszukujemy tę tabelę. Jeśli nie zostanie znaleziony, wykonaj kosztowne zapytanie i wypełnij tę tabelę. Jeśli zostanie znaleziony, wykonaj tanie zapytanie łączące te tabele. Inne narzędzia do buforowania, takie jak memcached, również będą działać.