Uma consulta como esta (recuperando todas ou a maioria das linhas) é mais rápida se você
GROUP
antes de JOIN
. Assim:SELECT id, name, created_at, updated_at, u.ct
FROM cars c
LEFT JOIN (
SELECT car_id, count(*) AS ct
FROM users
GROUP BY 1
) u ON u.car_id = c.id
ORDER BY u.ct DESC;
Dessa forma, você precisa de muito menos operações de junção. E as linhas da tabela
cars
não precisam ser multiplicados primeiro juntando-se a muitos usuários cada e depois agrupados de volta para serem únicos novamente.Apenas a tabela certa deve ser agrupada, o que torna a lógica mais simples também.