Reading a query plan from the bottom up
Find the earliest estimate that diverges from the rows the database actually saw.
Start at the leaf nodes and compare estimated rows with observed rows. Read the observed row count alongside the loop count. In PostgreSQL, the reported actual rows are averaged per loop, so a cheap-looking inner scan can account for substantial total work.
A large estimate error early in the plan can change the join order or join strategy chosen above it. Check the estimate and its inputs before deciding which index to add.