In case you have your own slow SQL query, you can optimize it automatically here.
For the query above, the following recommendations will be helpful as part of the SQL tuning process.
You'll find 3 sections below:
CREATE INDEX endorsements_idx_portfolio_id ON "endorsements" ("portfolio_id");
CREATE INDEX favorites_idx_subject_id ON "favorites" ("subject_id");
CREATE INDEX portfolios_idx_user_id ON "portfolios" ("user_id");
CREATE INDEX views_idx_subject_id ON "views" ("subject_id");
SELECT
t4.id,
t4.username,
t4.avatar_url,
p_count * 50 + ue_count * 2 + fav_count * 10 + ep_count * 2 + COUNT(vp.id) * 2 AS point
FROM
(SELECT
t3.id,
t3.username,
t3.avatar_url,
p_count,
ue_count,
fav_count,
COUNT(ep.id) AS ep_count
FROM
(SELECT
t2.id,
t2.username,
t2.avatar_url,
p_count,
ue_count,
COUNT(fav_p.id) AS fav_count
FROM
(SELECT
t1.id,
t1.username,
t1.avatar_url,
p_count,
COUNT(e.user_id) AS ue_count
FROM
(SELECT
u.*,
(SELECT
COUNT(p.user_id) AS p_count
FROM
portfolios p
WHERE
u.id = p.user_id LIMIT 1) AS p_count
FROM
users u) t1
LEFT OUTER JOIN
endorsements e
ON e.user_id = t1.id
GROUP BY
t1.id,
t1.username,
t1.avatar_url,
p_count) t2
LEFT OUTER JOIN
(
SELECT
p.id,
p.user_id
FROM
portfolios p
INNER JOIN
favorites
ON favorites.subject_id = p.id
) fav_p
ON fav_p.user_id = t2.id
GROUP BY
t2.id,
t2.username,
t2.avatar_url,
p_count,
ue_count) t3
LEFT OUTER JOIN
(
SELECT
p.id,
p.user_id
FROM
portfolios p
INNER JOIN
endorsements
ON endorsements.portfolio_id = p.id
) ep
ON ep.user_id = t3.id
GROUP BY
t3.id,
t3.username,
t3.avatar_url,
p_count,
ue_count,
fav_count) t4
LEFT OUTER JOIN
(
SELECT
p.id,
p.user_id
FROM
portfolios p
INNER JOIN
views
ON views.subject_id = p.id
) vp
ON vp.user_id = t4.id
GROUP BY
t4.id,
t4.username,
t4.avatar_url,
p_count,
ue_count,
fav_count,
ep_count
ORDER BY
point DESC LIMIT 8