The 30 second answer
I use the pg_stat_statements extension to rank queries by total and mean execution time, because a medium query called thousands of times can matter more than one slow query. Then I run EXPLAIN with ANALYZE and BUFFERS on the worst ones. That shows the real plan, actual row counts versus estimates, and how many pages came from cache or disk.
pg_stat_statements keeps per-query stats such as calls, total_exec_time and mean_exec_time. Sort by total time to find what costs most overall. EXPLAIN ANALYZE runs the query and shows real row counts and times. BUFFERS shows pages hit in cache versus read from disk.
SELECT query, calls, total_exec_time, mean_exec_time
FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10;
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;