應用資料庫 中階
N+1 查詢問題是什麼?如何偵測與解決?
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 評分
