iT邦幫忙

2024 iThome 鐵人賽

DAY 12
1
自我挑戰組

學習網頁開發系列 第 12

N+1 問題

  • 分享至 

  • xImage
  •  

在程式世界裡,N+1 問題是指資料庫的 N+1 查詢問題,這直接影響到資料庫的效能。當程式對每條記錄都多做一次搜尋時,這個問題就會發生。N+1 問題經常發生在處理關聯數據的情況下,例如當一個物件需要查詢其相關的多個物件時,這些關聯查詢若未優化,將會導致大量的額外查詢。

舉例

假定一個資料表「書籍」有一個關聯列表「作者」。今天要取得一個包含 N 本書的列表,並且需要為每本書取得他們的作者。應用程式可能會先執行一次查詢來獲取所有書籍,接著對每本書再分別執行一次查詢來取得它們的作者。結果,原本只需一個查詢的操作,現在變成了 N+1 次查詢(1 次查詢取得書本,N 次查詢取得每本書的作者)。

以 Django Template 為例:

{% comment %} 
    取得 books 一次查詢,各個 book.author 再各查詢一次
{% endcomment %}

{% for book in books %}
    {{ book.author }}
{% endfor %}

問題

這樣會導致不必要的資料庫查詢次數增加,尤其是當資料量龐大時,效能問題會更加顯著。

如何避免

可以使用預載入(eager loading)或 JOIN 操作來一次性將相關資料查詢出來,而不是逐條執行多次查詢。透過在 Django 中使用 select_related 或 prefetch_related 方法,可以有效解決 N+1 查詢問題,提高查詢效能。


上一篇
Nginx
下一篇
利用 Django Channels 讓 Django 兼容 Websockets 第一篇
系列文
學習網頁開發13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言