MySQL5 : Optimisation MySQL - Group by et Count

24-07-2013
Laurent Bientz

2 bonnes requêtes valent mieux qu'un bon discours afin de comprendre sur quelle colonne grouper lorsque l'on veut obtenir le count d'une jointure.

La 1ère requête prend 12s :

SELECT
    n.*,
    COUNT(DISTINCT(l.like_id)) AS nb_likes
FROM
    news n
    JOIN like l ON n.news_id = l.news_id
GROUP BY
    l.news_id

La 2ème requête prend 0,5s :

SELECT
    n.*,
    COUNT(DISTINCT(l.like_id)) AS nb_likes
FROM
    news n
    JOIN like l ON n.news_id = l.news_id
GROUP BY
    n.news_id

Ces 2 requêtes donnent pourtant exactement le même résultat, à savoir l'ensemble des news ainsi que le nombre de likes par news.

Pour info, la table news comporte 300 enregistrements et la table like comporte 5M d'enregistrements.

La morale est la suivante : lorsque vous devez effectuer ce genre d'opération, effectuer toujours le group by sur la clé (PK ou FK avec un index bien entendu) de la table la moins importante en terme de recordsets.

Louis - 2013-12-26 08:47:37
C'est assez flippant, merci bien pour l'info, ca devrait être dans les best practices MySQL !

Expérience utilisateur

Wandi vous propose de découvrir une nouvelle approche de la navigation sur un site web...
Êtes-vous prêt ?

Démarrer l'expérience