Suivi — Étiquettes Étiquettes populaires et performances

#1965 Posté par (site web personnel) . État de l’entrée : corrigée. Assigné à Benoît Sibaud. 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 à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.