One query for parents and N queries for children
網路上關於 N+1 Query Problem
的介紹已經非常多,這邊想要多用現實生活的例子闡述。
日常要出門的時候,通常會帶上一個背包,而背包容量有限,所以我們會盡可能地只攜帶必需物品,而且重量越少越好。
有此可知有兩個因素會決定抵達目的地的時間
然而就算事前做了這麼多的準備,抵達目的地的時候,還是有可能會發現有東西沒帶到,逼不得已的時候,需要再往返家裡一趟。
因為想要加快單次查詢的時間,並且盡可能減少要查詢的資訊量,以利查詢加速。
在這樣的背景之下,就會容易遇到 N+1 Query
,透過上面的故事可以了解到,N+1 並不是一個如同妖魔的存在,它的存在其實也是以效能為出發點,如果當次的查詢結果中,並沒有包含所需要的資料,而且在每次需要使用到的時候才發現這件事,回到資料庫中再做一次查詢。
這樣的過程,就是 N+1 Query,沒有辦法只使用 1 次的 Query 就取得全部需要的資料,而被迫得要再度執行 N 次的查詢才可以。
一樣要回過頭看看真實世界的故事,當今天想要減少往返家裡的次數,所以決定要一口氣準備好全部的東西,這樣才不會面臨一直跑回家的情況,但這種決定,卻會大幅增加當次出門的時間,而且過程中會攜帶非常多的資料,而且大多數或許是用不到的(資料浪費
)