N+1 查詢問題是指數據查詢的效能問題。通常會在使用 ORM 的時候出現。
假設我們有兩個實體 :
它們之間有一對多的關聯,也就是一個用戶可以擁有多篇的文章。
當我們想要獲取所有用戶以及每個用戶的貼文時,最簡單的方式就是獲取所有用戶,在單獨對每個用戶進行查詢。
這將會導致以下查詢:
因此,總共會執行 N+1 次的查詢。當數據資料龐大時,這種方式就會使得效能迅速下降。
使用 Eager Loading ( 預加載 )。
Eageer Loading 允許我們在一個查詢當中獲取所有相關的數據,而不是對每個紀錄做單獨的查詢。
例如上方的例子我們就可以用 includes 來解決 N+1 的問題 :
@users = User.includes(:posts) # 預加載用戶的貼文