Избавиться от join. Выбирать только
SELECT * FROM products ORDER BY views DESC LIMIT 24
А потом для выбранных 24 товаров выбрать категории. Например, результат вышеуказанного запроса в CREATE TEMPORARY TABLE ... и уже ее join product_category.
Создать индексы по views и связанным полям.
P.S. У вас запрос неправильный. Потому что нельзя
SELECT category_products.category_id
, когда
GROUP BY products.id