Il pianificatore, molto probabilmente, non sta usando il limit
suggerimento per eliminare le righe dalla tabella degli ordini prima del join. Quindi il server deve eseguire il join per tutte le righe e quindi restituirne solo alcune.
Prova questo:
select o.* from
(select * order order by id desc limit 100) o
inner join product p
on o.product_id=p.id
inner join person per
on o.person_id=per.id
order by o.id desc limit 100;
EDIT:funzionerà solo se esiste un vincolo che garantisce che le righe corrispondenti siano presenti nelle tabelle Prodotto e Persona.