Я так понимаю под запрос сделан, чтоб вытащить первую фотку? Дело в том что ORDER BY всегда делает tmp таблицы для сортировки, хотя в EXPLAIN я в данном случае не вижу.
Попробуйте так:
SELECT
p.`id`,
p.`name`,
p.`category_id`,
v.`name` AS vendor,
p.`price_ya`,
pp.`value` AS price,
pp.`fix_currency_id`,
ph.`id` AS photo,
px.`status`
FROM
`products_prices` AS pp,
`xml_products` AS px,
`products` AS p
LEFT JOIN `vendors` AS v
ON p.`vendor_id` = v.`id`
LEFT JOIN `products_photos` ph
ON ph.`product_id` = p.`id`
WHERE pp.`price_id` = '2'
AND p.`id` = pp.`product_id`
AND p.`id` = px.`product_id`
AND px.`site_id` = '2'
GROUP BY p.`id`
Тут GROUP By сгрупирует, а в left join выйдет первый id, если не ошибаюсь. Сложно без базы анализировать.
Еще нужно учитывать версии mysql, в каждой версии используются по разному индексы, который я кстати вообще не вижу, везде using where.