iT邦幫忙

2023 iThome 鐵人賽

DAY 27
0

N+1 查詢問題是指數據查詢的效能問題。通常會在使用 ORM 的時候出現。

假設我們有兩個實體 :

  1. User
  2. Post

它們之間有一對多的關聯,也就是一個用戶可以擁有多篇的文章。
當我們想要獲取所有用戶以及每個用戶的貼文時,最簡單的方式就是獲取所有用戶,在單獨對每個用戶進行查詢。

這將會導致以下查詢:

  1. 查詢所有用戶
  2. 查詢每個用戶的所有貼文

因此,總共會執行 N+1 次的查詢。當數據資料龐大時,這種方式就會使得效能迅速下降。

解決方式

使用 Eager Loading ( 預加載 )。
Eageer Loading 允許我們在一個查詢當中獲取所有相關的數據,而不是對每個紀錄做單獨的查詢。

例如上方的例子我們就可以用 includes 來解決 N+1 的問題 :

@users = User.includes(:posts)  # 預加載用戶的貼文

上一篇
Rails 查詢語句? 什麼時候該用哪個? Day 26
下一篇
資料結構 Day28
系列文
從餐飲業轉職成小白工程師的所見所學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言