應用資料庫 中階

N+1 查詢問題是什麼?如何偵測與解決?

AI 練習作答

N+1 查詢問題

什麼是 N+1?

查詢 1 次取得 N 筆父記錄,再對每筆各查詢 1 次子記錄 → 共 N+1 次查詢

例(ORM 常見陷阱)

// 查詢 100 個 User(1次)
const users = await User.findAll()
// 對每個 user 查詢 posts(100次!)
for (const user of users) {
  const posts = await user.getPosts()
}
// 總計:101 次查詢

解決方案

1. Eager Loading(預先載入)

// Sequelize
const users = await User.findAll({ include: [Post] })
// 只需 2 次查詢(1次 users + 1次 posts IN (...))

2. JOIN 查詢

直接用 SQL JOIN 一次取得所有資料

3. DataLoader(GraphQL)

批次收集所有 ID,一次查詢,再分發結果

偵測方式

  • 在開發環境開啟 SQL 日誌,觀察重複的查詢模式
  • 使用 APM 工具(Datadog、New Relic)追蹤資料庫查詢數
  • Bullet Gem(Ruby on Rails)自動偵測 N+1

面試加分:能解釋 Eager Loading 也有風險——過度 eager load 可能 JOIN 太多表,導致查詢反而變慢(選擇性地只 load 需要的關聯)。

✦ AI 模擬面試

輸入你的答案,AI 即時分析精準度與改進空間

登入後即可使用 AI 評分