赫謙小便籤

N+1 Queries

什麼是 N+1 Query

在Rails中有個ActiveRecord,它可以很容易產生資料庫關連、操作的東西。

但是關連這種東西一用不好就有可能造成災難,看看範例。

範例?

我有一個CrashLog model belongs_to Product,然後在CrashLog內用Delegate對應到Productname

    # 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 就會變成另外一種結果

怎麼樣?很恐怖吧!

Comments