[RUBY] [Anfänger] Entdecken Sie das N + 1-Problem! Wie benutzt man Bullet?

Was ist das N + 1-Problem?

Die Anzahl der ausgegebenen SQLs steigt proportional zur Anzahl der zu verarbeitenden Daten. Dieses Problem wirkt sich auf die Leistung aus und sollte behoben werden. Als Analogie höre ich oft, dass das N + 1-Problem darin besteht, dass Sie beim Kauf vieler Produkte zum Einkaufen nur für jeden Artikel bezahlen.

Was ist eine Kugel?

Es ist eine Bibliothek, die "N + 1 Probleme" findet.

Einführungsmethode

Gemfile


group :development do
  gem 'bullet'
end

Bundle installieren. Einstellen.

config/environments/development.rb



Rails.application.configure do 
 #Unterwegs weggelassen

  config.after_initialize do
    Bullet.enable = true #Aktiviere Bullet Gem
    Bullet.alert = true #Popup-JavaScript-Warnung im Browser
    Bullet.bullet_logger = true #Aufzählungsprotokolldatei (Rails.root/log/bullet.Log)
    Bullet.console = true #Warnung Browser-Konsole.Im Protokoll aufzeichnen
    Bullet.rails_logger = true #Fügen Sie Warnungen direkt zu Rails-Protokollen hinzu
  end
end

Lösungen

Wenn Sie eine Kugel verwenden, werden ein Warnbildschirm und ein Protokoll angezeigt.

Stellen Sie beispielsweise die Beziehung zwischen Benutzern und Posts eins zu viele ein.

user.rb


class User < ApplicationRecord
  has_many :posts
end

post.rb


class Post < ApplicationRecord
  belongs_to :user
end

Gibt den Benutzernamen für alle Beiträge aus.

Post.all.each do |post|
  puts post.user.name
end
USE eager loading detected
Psot => [:user]
Add to your finder::incluedes => [:user]

Sie sehen solche Protokolle und Warnmeldungen. Deshalb,

Post.inculudes(:user).each do |post|
  puts post.user.name
end

Wenn ja, ist es OK.

Recommended Posts

[Anfänger] Entdecken Sie das N + 1-Problem! Wie benutzt man Bullet?
Verwendung von JUnit (Anfänger)
Verwendung der Methode form_with
Verwendung der Wrapper-Klasse
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
[Verarbeitung × Java] Verwendung der Schleife
[Verarbeitung × Java] Verwendung der Klasse
[Verarbeitung × Java] Verwendung der Funktion
[Java] Verwendung der Calendar-Klasse
Verwendung des Kameramoduls OV7725 (ESP32-WROVER-B)
Ausgabe der Verwendung der Slice-Methode
Verwendung der replace () -Methode (Java Silver)
[Ruby-Grundlagen] Verwendung der Slice-Methode
Verwendung von Map
Wie benutzt man rbenv?
Verwendung von fields_for
Verwendung von java.util.logging
Verwendung der Karte
Verwendung von collection_select
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
Verwendung von MapStruct
Verwendung von TreeSet
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
[Rails] Ich weiß nicht, wie ich das Modell verwenden soll ...
[Anfänger] Verwendung des Geräts Ändern Sie die Einstellungen ab Einführung
Verwendung der Ketten-API
[Java] Verwendung von Map
Verwendung der Warteschlange mit Priorität
Unterschätzen Sie das N + 1-Problem nicht!
[Rails] Verwendung von Enum
Verwendung von Ruby return
[Rails] Verwendung von Enum
Verwendung von @Builder (Lombok)
Verwendung der Java-Klasse
Wie man Big Decimal benutzt
[Java] Verwendung von removeAll ()
Verwendung von String [] args
Verwendung von Rails Join
Verwendung von Java Map
Ruby: Wie man Cookies benutzt
Verwendung von abhängigen :: zerstören