什麼是 N+1 Query
在Rails中有個ActiveRecord,它可以很容易產生資料庫關連、操作的東西。
但是關連這種東西一用不好就有可能造成災難,看看範例。
範例?
我有一個CrashLog
model belongs_to Product
,然後在CrashLog
內用Delegate對應到Product
的name
# crash_log.rb
delegate :name, to: :product, prefix: true
如此一來可以用c = CrashLog.first; c.product_name
來直接存取到product.name
可是當你用迴圈的時候就有可能遇到 N+1 Query。
譬如說我在首頁上面寫的是 @crash_logs = CrashLog.all
結果SQL跑出上百筆類似以下的東西:
但是如果當我改成 @crash_logs = CrashLog.includes :product
就會變成另外一種結果
怎麼樣?很恐怖吧!