Suivi — Étiquettes Étiquettes populaires et performances

#1965 Posté par  (site Web personnel) . État de l’entrée : corrigée. Licence CC By‑SA.
Étiquettes : aucune
1
16
jan.
2021

Une campagne récente de ré-étiquetage massif a montré un effet des étiquettes populaires dans le bas de page :

https://pix.toile-libre.org/upload/original/1610822726.png

(l'évolution de la courbe correspond en fait à l'évolution temps de rendu de _layouts/_footer.html.haml )

Bref on va avoir besoin d'une mise en cache (pour éviter la sensibilité sur les étiquetages du dernier mois).

  • # Double jointure de la mort

    Posté par  (site Web personnel) . Évalué à 3 (+0/-0).

    Le souci vient d'une double jointure, que j'ai involontairement introduite précédemment pour masquer les étiquettes masquées et les étiquettes des contenus masqués.

    commit 340eacd82cf82b9bffc089ad5c02383dadd76a71
    Author: Benoît Sibaud <oumph@linuxfr.org>
    Date:   Wed Nov 21 20:47:14 2018 +0100
    
        Popular tags based only on public nodes
    
    diff --git a/app/models/tag.rb b/app/models/tag.rb
    index dc97553d..39f31643 100644
    --- a/app/models/tag.rb
    +++ b/app/models/tag.rb
    @@ -20,8 +20,10 @@ class Tag < ActiveRecord::Base
       scope :footer, -> {
         select([:name]).joins(:taggings).
                         where(public: true).
    -                    where("created_at > ?", 1.month.ago).
    -                    group(:tag_id).
    +                    joins(:nodes).
    +                    where("nodes.public = 1").
    +                    where("taggings.created_at > ?", 1.month.ago).
    +                    group("taggings.tag_id").
                         order(Arel.sql("COUNT(*) DESC")).
                         limit(12)
       }

    (:nodes contient déjà une jointure via taggings, donc on fait une double jointure via taggings, et dès qu'il y a beaucoup d'étiquetages, le résultat est monstrueux… exemple: "43454465 rows in set (1 min 41.74 sec)" avec un essai d'insertion de 6500 étiquetages…)

    Une correction serait :

       scope :footer, -> {
    -    select([:name]).joins(:taggings).
    -                    where(public: true).
    -                    joins(:nodes).
    -                    where("nodes.public = 1").
    +    select([:name]).visible.
    +                    joins(:nodes).merge(Node.visible).
                         where("taggings.created_at > ?", 1.month.ago).
                         group("taggings.tag_id").
                         order(Arel.sql("COUNT(*) DESC")).

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.