Bessere Leistung auf Verbände
-
21-08-2019 - |
Frage
Im Moment habe ich eine Tabelle namens Kampagnen, die viele Hits hat, wenn ich rufe sagen:
Campaign.find(30).hits
Welche dauert 4 Sekunden bzw. 4213 ms.
Wenn ich rufe Sie stattdessen:
campaign = Campaign.find(30) campaign.hits.count
Ist es immer noch alle Treffer laden, dann zählen? Oder sieht es zähle ich und vermeidet alle Treffer Laden? (Welche ist derzeit als 300.000 Zeilen).
Ich versuche, eine intelligente Art und Weise, um herauszufinden, meine Treffer zu laden / zählen. Ich denke an eine Methode zu meinem Campaign.rb Modell hinzufügen, wie:
def self.total_hits find :first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.id] end
Ich weiß, dass Abfrage wird von der hits
Tabelle nicht geladen werden, aber das ist nur ein Beispiel davon aus einer selbst erstellten Abfrage, apposed Ruby on Rails zu zählen dies zu tun für mich.
Würde dies memcache Abfrage mehr effecient sein? (Ich habe es läuft, aber scheint nicht besser / schneller zu sein / langsamer, nur die gleiche Geschwindigkeit.)
def self.hits Rails.cache.fetch("Campaign_Hits_#{self.campaign_id}", :expires_in => 40) { find(:first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.campaign_id]).hits } end
Irgendwelche Vorschläge wäre toll!
Lösung
Wie wäre:
Campaign.find(30).hits.count
Sie können auch die folgenden in hit.rb
(unter der Annahme einer Eins-zu-viele-Beziehung zwischen Kampagnen und Hits) betrachten hinzufügen.
belongs_to :campaign, :counter_cache => true
Sie müssen dann eine Spalte in der Tabelle campaigns
genannt hits_count
. Dadurch wird vermieden, hits
trifft völlig, wenn Sie nur die Zählung zu bekommen.
Sie können die API für den vollständigen Überblick.
Andere Tipps
Meine Active könnte ein wenig rostig, sein so verzeiht mir, wenn ja, aber IIRC Campaign.find(30).hits
mindestens zwei getrennte Abfragen. Wie macht Campaign.find(30, :include => [ :hits ]).hits
? Das sollte eine einzelne Abfrage durchführen.