Включите режим полного отображения полей, а то в первом варианте поле Extra обрезалось. Кроме того непонятно, а где данные для class_slugs?
И 2500 вместо 80000 - это и есть выигрыш от использования индекса.
Можно еще перенести одно условие из WHERE в INNER JOIN.
Просто сохраняй где-нибудь на диске файл с результатом работы (HTML), и если с момента последнего изменения файла прошло больше 59 секунд - генерируй и записывай и отдавай пользователю новый HTML. А если меньше 60 секунд - просто выводи содержимое файла (там же HTML?).
Хммм, в старой версии кода в $product_features данные писались под определёным индексом $product_values[]->feature_id, а в новой - под первым попавшимся свободным числом. Однако ошибка?
И 2500 вместо 80000 - это и есть выигрыш от использования индекса.
Можно еще перенести одно условие из WHERE в INNER JOIN.